diff --git a/Core/.classpath b/Core/.classpath index d4018e70eb..5e27464e9f 100644 --- a/Core/.classpath +++ b/Core/.classpath @@ -1,44 +1,32 @@ - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/Core/.externalToolBuilders/Core - Eclipse JSP Compile [Builder].launch b/Core/.externalToolBuilders/Core - Eclipse JSP Compile [Builder].launch new file mode 100644 index 0000000000..72ce09c9af --- /dev/null +++ b/Core/.externalToolBuilders/Core - Eclipse JSP Compile [Builder].launch @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/.gitignore b/Core/.gitignore index b2e7332325..84f5cc0124 100644 --- a/Core/.gitignore +++ b/Core/.gitignore @@ -14,3 +14,7 @@ /release /save /mango.build.number +/maven-target +/databases +/backup +/dist/ diff --git a/Core/.project b/Core/.project index 1e47631ca5..75fa9ba894 100644 --- a/Core/.project +++ b/Core/.project @@ -1,18 +1,47 @@ - - - Core - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - org.apache.derby.ui.derbyEngine - - + + + Core + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/Core - Eclipse JSP Compile [Builder].launch + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + org.apache.derby.ui.derbyEngine + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/Core/.settings/.jsdtscope b/Core/.settings/.jsdtscope new file mode 100644 index 0000000000..a58fb16f38 --- /dev/null +++ b/Core/.settings/.jsdtscope @@ -0,0 +1,5 @@ + + + + + diff --git a/Core/.settings/org.eclipse.core.resources.prefs b/Core/.settings/org.eclipse.core.resources.prefs index 6123c5337a..6953d076ea 100644 --- a/Core/.settings/org.eclipse.core.resources.prefs +++ b/Core/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,3 @@ eclipse.preferences.version=1 +encoding/LICENSE=UTF-8 encoding/RELEASE-NOTES=UTF-8 diff --git a/Core/.settings/org.eclipse.jdt.core.prefs b/Core/.settings/org.eclipse.jdt.core.prefs index 838bd9d694..ec4300d5d0 100644 --- a/Core/.settings/org.eclipse.jdt.core.prefs +++ b/Core/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,5 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Core/.settings/org.eclipse.m2e.core.prefs b/Core/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/Core/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Core/.settings/org.eclipse.wst.common.component b/Core/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000000..28d3a566a2 --- /dev/null +++ b/Core/.settings/org.eclipse.wst.common.component @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/Core/.settings/org.eclipse.wst.common.project.facet.core.xml b/Core/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000000..bc0009a455 --- /dev/null +++ b/Core/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,4 @@ + + + + diff --git a/Core/.settings/org.eclipse.wst.jsdt.ui.superType.container b/Core/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000000..3bd5d0a480 --- /dev/null +++ b/Core/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/Core/.settings/org.eclipse.wst.jsdt.ui.superType.name b/Core/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000000..05bd71b6ec --- /dev/null +++ b/Core/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/Core/Getting Started.txt b/Core/Getting Started.txt new file mode 100644 index 0000000000..46789b3f78 --- /dev/null +++ b/Core/Getting Started.txt @@ -0,0 +1,22 @@ +Congratulations for downloading Mango. Here are some tips to get you up and running as fast as possible. + +For help installing see our Installation form: http://forum.infiniteautomation.com/forum/forums/show/20.page + +*****Installation***** + +Mango requires Java JDK 1.7 (also known as JDK 7) to be already installed on your system. Infinite Automation recommends using the Oracle JDK 7.. You may need to set a JAVA_HOME environmental variable pointing to your JDK install folder. + +1.) Unzip the Mango zip file into any directory you like. +2.) To start Mango Automation, run one of the scripts provided in the /bin folder, either ma-start.bat for Windows platforms or ma.sh for *nix or Mac. (Also note: for *nix you may have to run "chmod +x ma-start.sh" to make the script executable.) +In addition, for *nix users ensure that the Mango home directory and all subdirectories are writable by the user under which Mango will run. + +To use the /bin/ma.sh script on your command line, change to the bin directory and then type ./ma.sh start or ./ma.sh stop + +If you are having trouble starting Mango Automation: + +1. Make sure you have Java JDK 1.7 installed. +2. JAVA_HOME is set to the Java JDK 1.7 install directory. On windows usually: C:\Program Files\Java\jdk1.7.0_XX +3. Nothing else is using port 8080 or change Mango to run on a different port. See the /classes/env.properties file to set the new port number, read the instructions on how to use the overrides directory. + +If you still have trouble and you notice that script window briefly pops up and then the window closes: Open a command prompt and run mango from there so the window doesn't close. Make a post in this forum with the results of the script and we will help you diagnose the issue. + diff --git a/Core/LICENSE b/Core/LICENSE index c1747942dc..c985ff700a 100644 --- a/Core/LICENSE +++ b/Core/LICENSE @@ -1,263 +1,263 @@ -Serotonin Software Mango Automation Terms of Service - -These Terms of Service apply to the executable code version of Mango Automation. - -1. Your relationship with Serotonin -1.1 Your use of Serotonins products, software, services and web sites (referred to collectively as the Services in -this document and excluding any services provided to you by Serotonin under a separate written agreement) is subject to -the terms of a legal agreement between you and Serotonin. Serotonin means Serotonin Software Inc., whose principal -place of business is at 90 Castleglen Blvd, Markham, Ontario, Canada. This document explains how the agreement is made -up, and sets out some of the terms of that agreement. - -1.2 Unless otherwise agreed in writing with Serotonin, your agreement with Serotonin will always include, at a minimum, -the terms and conditions set out in this document. These are referred to below as the Universal Terms. - -1.3 Your agreement with Serotonin will also include the terms set forth below in the Serotonin Mango Automation -Additional Terms of Service and terms of any Legal Notices applicable to the Services, in addition to the Universal -Terms. All of these are referred to below as the Additional Terms. Where Additional Terms apply to a Service, these -will be accessible for you to read either within, or through your use of, that Service. - -1.4 The Universal Terms, together with the Additional Terms, form a legally binding agreement between you and Serotonin -in relation to your use of the Services. It is important that you take the time to read them carefully. Collectively, -this legal agreement is referred to below as the Terms. - -1.5 If there is any contradiction between what the Additional Terms say and what the Universal Terms say, then the -Additional Terms shall take precedence in relation to that Service. - -2. Accepting the Terms -2.1 In order to use the Services, you must first agree to the Terms. You may not use the Services if you do not accept -the Terms. - -2.2 You can accept the Terms by: -(A) clicking to accept or agree to the Terms, where this option is made available to you by Serotonin in the user -interface for any Service; or - -(B) by actually using the Services. In this case, you understand and agree that Serotonin will treat your use of the -Services as acceptance of the Terms from that point onwards. - -3. Provision of the Services by Serotonin -3.1 Serotonin is constantly innovating in order to provide the best possible experience for its users. You acknowledge -and agree that the form and nature of the Services which Serotonin provides may change from time to time without prior -notice to you. - -3.2 As part of this continuing innovation, you acknowledge and agree that Serotonin may stop (permanently or -temporarily) providing the Services (or any features within the Services) to you or to users generally at Serotonins -sole discretion, without prior notice to you. You may stop using the Services at any time. You do not need to -specifically inform Serotonin when you stop using the Services. - -3.3 You acknowledge and agree that if Serotonin disables access to your account, you may be prevented from accessing -the Services, your account details or any files or other content which is contained in your account. - -4. Use of the Services by you -4.1 You agree to use the Services only for purposes that are permitted by (a) the Terms and (b) any applicable law, -regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding -the export of data or software to and from Canada or other relevant countries). - -4.2 You agree that you will not engage in any activity that interferes with or disrupts the Services (or the servers -and networks which are connected to the Services). - -4.3 Unless you have been specifically permitted to do so in a separate agreement with Serotonin, you agree that you -will not reproduce, duplicate, copy, sell, trade or resell the Services for any purpose. - -4.4 You agree that you are solely responsible for (and that Serotonin has no responsibility to you or to any third -party for) any breach of your obligations under the Terms and for the consequences (including any loss or damage which -Serotonin may suffer) of any such breach. - -5. Proprietary rights - -5.1 You acknowledge and agree that Serotonin (or Serotonins licensors) own all legal right, title and interest in and -to the Services, including any intellectual property rights which subsist in the Services (whether those rights happen -to be registered or not, and wherever in the world those rights may exist). - -5.2 Unless you have agreed otherwise in writing with Serotonin, nothing in the Terms gives you a right to use any of -Serotonins trade names, trade marks, service marks, logos, domain names, and other distinctive brand features. - -5.3 Serotonin acknowledges and agrees that it obtains no right, title or interest from you (or your licensors) under -these Terms in or to any Content that you submit, post, transmit or display on, or through, the Services, including any -intellectual property rights which subsist in that Content (whether those rights happen to be registered or not, and -wherever in the world those rights may exist). Unless you have agreed otherwise in writing with Serotonin, you agree -that you are responsible for protecting and enforcing those rights and that Serotonin has no obligation to do so on -your behalf. - -5.4 You agree that you shall not remove, obscure, or alter any proprietary rights notices (including copyright and -trade mark notices) which may be affixed to or contained within the Services. - -5.5 Unless you have been expressly authorized to do so in writing by Serotonin, you agree that in using the Services, you -will not use any trade mark, service mark, trade name, logo of any company or organization in a way that is likely or -intended to cause confusion about the owner or authorized user of such marks, names or logos. - -6. License from Serotonin -6.1 Serotonin gives you a personal, worldwide, royalty-free, non-assignable and non-exclusive license to use the -software provided to you by Serotonin as part of the Services as provided to you by Serotonin (referred to as the -Software below). This license is for the sole purpose of enabling you to use and enjoy the benefit of the Services as -provided by Serotonin, in the manner permitted by the Terms. - -6.2 Subject to section 1.2, you may not (and you may not permit anyone else to) copy, modify, create a derivative work -of, reverse engineer, decompile or otherwise attempt to extract the source code of the Software or any part thereof, -unless this is expressly permitted or required by law, or unless you have been specifically told that you may do so by -Serotonin, in writing. - -6.3 Subject to section 1.2, unless Serotonin has given you specific written permission to do so, you may not assign (or -grant a sub-license of) your rights to use the Software, grant a security interest in or over your rights to use the -Software, or otherwise transfer any part of your rights to use the Software. - -7. Content license from you -7.1 You retain copyright and any other rights you already hold in Content which you create on or through, the Services. - -8. Software updates -8.1 The Software which you use may automatically download and install updates from time to time from Serotonin. These -updates are designed to improve, enhance and further develop the Services and may take the form of bug fixes, enhanced -functions, new software modules and completely new versions. You agree to receive such updates (and permit Serotonin to -deliver these to you) as part of your use of the Services. - -9. Ending your relationship with Serotonin -9.1 The Terms will continue to apply until terminated by either you or Serotonin as set out below. - -9.2 Serotonin may at any time, terminate its legal agreement with you if: -(A) you have breached any provision of the Terms (or have acted in manner which clearly shows that you do not intend -to, or are unable to comply with the provisions of the Terms); or - -(B) Serotonin is required to do so by law (for example, where the provision of the Services to you is, or becomes, -unlawful); or - -(C) the partner with whom Serotonin offered the Services to you has terminated its relationship with Serotonin or -ceased to offer the Services to you; or - -(D) Serotonin is transitioning to no longer providing the Services to users in the country in which you are resident or -from which you use the service; or - -(E) the provision of the Services to you by Serotonin is, in Serotonins opinion, no longer commercially viable. - -9.3 Nothing in this Section shall affect Serotonins rights regarding provision of Services under Section 4 of the -Terms. - -9.4 When these Terms come to an end, all of the legal rights, obligations and liabilities that you and Serotonin have -benefited from, been subject to (or which have accrued over time whilst the Terms have been in force) or which are -expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall -continue to apply to such rights, obligations and liabilities indefinitely. - -10. EXCLUSION OF WARRANTIES -10.1 NOTHING IN THESE TERMS, INCLUDING SECTIONS 10 AND 11, SHALL EXCLUDE OR LIMIT SEROTONINS WARRANTY OR LIABILITY FOR -LOSSES WHICH MAY NOT BE LAWFULLY EXCLUDED OR LIMITED BY APPLICABLE LAW. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION -OF CERTAIN WARRANTIES OR CONDITIONS OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR LOSS OR DAMAGE CAUSED BY NEGLIGENCE, -BREACH OF CONTRACT OR BREACH OF IMPLIED TERMS, OR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, ONLY THE LIMITATIONS -WHICH ARE LAWFUL IN YOUR JURISDICTION WILL APPLY TO YOU AND OUR LIABILITY WILL BE LIMITED TO THE MAXIMUM EXTENT -PERMITTED BY LAW. - -10.2 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SERVICES IS AT YOUR SOLE RISK AND THAT THE SERVICES ARE -PROVIDED "AS IS" AND AS AVAILABLE. - -19.3 IN PARTICULAR, SEROTONIN, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS DO NOT REPRESENT OR WARRANT TO YOU -THAT: -(A) YOUR USE OF THE SERVICES WILL MEET YOUR REQUIREMENTS, - -(B) YOUR USE OF THE SERVICES WILL BE UNINTERRUPTED, TIMELY, SECURE OR FREE FROM ERROR, - -(C) ANY INFORMATION OBTAINED BY YOU AS A RESULT OF YOUR USE OF THE SERVICES WILL BE ACCURATE OR RELIABLE, AND - -(D) THAT DEFECTS IN THE OPERATION OR FUNCTIONALITY OF ANY SOFTWARE PROVIDED TO YOU AS PART OF THE SERVICES WILL BE -CORRECTED. - -10.4 NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM SEROTONIN OR THROUGH OR FROM THE SERVICES -SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THE TERMS. - -10.5 SEROTONIN FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE -AND NON-INFRINGEMENT. - -11. LIMITATION OF LIABILITY -11.1 SUBJECT TO OVERALL PROVISION IN PARAGRAPH 10.1 ABOVE, YOU EXPRESSLY UNDERSTAND AND AGREE THAT SEROTONIN, ITS -SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU FOR: -(A) ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL CONSEQUENTIAL OR EXEMPLARY DAMAGES WHICH MAY BE INCURRED BY YOU, HOWEVER -CAUSED AND UNDER ANY THEORY OF LIABILITY. THIS SHALL INCLUDE, BUT NOT BE LIMITED TO, ANY LOSS OF PROFIT (WHETHER -INCURRED DIRECTLY OR INDIRECTLY), ANY LOSS OF GOODWILL OR BUSINESS REPUTATION, ANY LOSS OF DATA SUFFERED, COST OF -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR OTHER INTANGIBLE LOSS; - -(B) ANY LOSS OR DAMAGE WHICH MAY BE INCURRED BY YOU, INCLUDING BUT NOT LIMITED TO LOSS OR DAMAGE AS A RESULT OF: - -(I) ANY RELIANCE PLACED BY YOU ON THE COMPLETENESS, ACCURACY OR EXISTENCE OF ANY ADVERTISING, OR AS A RESULT OF ANY -RELATIONSHIP OR TRANSACTION BETWEEN YOU AND ANY ADVERTISER OR SPONSOR WHOSE ADVERTISING APPEARS ON THE SERVICES; - -(II) ANY CHANGES WHICH SEROTONIN MAY MAKE TO THE SERVICES, OR FOR ANY PERMANENT OR TEMPORARY CESSATION IN THE PROVISION -OF THE SERVICES (OR ANY FEATURES WITHIN THE SERVICES); - -(III) THE DELETION OF, CORRUPTION OF, OR FAILURE TO STORE, ANY CONTENT AND OTHER COMMUNICATIONS DATA MAINTAINED OR -TRANSMITTED BY OR THROUGH YOUR USE OF THE SERVICES; - -(IV) YOUR FAILURE TO PROVIDE SEROTONIN WITH ACCURATE ACCOUNT INFORMATION; - -(V) YOUR FAILURE TO KEEP YOUR PASSWORD OR ACCOUNT DETAILS SECURE AND CONFIDENTIAL; - -11.2 THE LIMITATIONS ON SEROTONINS LIABILITY TO YOU IN PARAGRAPH 11.1 ABOVE SHALL APPLY WHETHER OR NOT SEROTONIN HAS -BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. - -12. Copyright and trade mark policies -12.1 It is Serotonins policy to respond to notices of alleged copyright infringement that comply with applicable -international intellectual property law and to terminating the accounts of repeat infringers. - -13. Changes to the Terms -13.1 Serotonin may make changes to the Universal Terms or Additional Terms from time to time. When these changes are -made, Serotonin will make a new copy of the terms available to you from within, or through, the affected Services. - -13.2 You understand and agree that if you use the Services after the date on which the Universal Terms or Additional -Terms have changed, Serotonin will treat your use as acceptance of the updated Universal Terms or Additional Terms. - -14. General legal terms -14.1 Sometimes when you use the Services, you may (as a result of, or in connection with your use of the Services) use -a service or download a piece of software, or purchase goods, which are provided by another person or company. Your use -of these other services, software or goods may be subject to separate terms between you and the company or person -concerned. If so, the Terms do not affect your legal relationship with these other companies or individuals. - -14.2 The Terms constitute the whole legal agreement between you and Serotonin and govern your use of the Services (but -excluding any services which Serotonin may provide to you under a separate written agreement), and completely replace -any prior agreements between you and Serotonin in relation to the Services. - -14.3 You agree that Serotonin may provide you with notices, including those regarding changes to the Terms, by email, -regular mail, or postings on the Services. - -14.4 You agree that if Serotonin does not exercise or enforce any legal right or remedy which is contained in the Terms -(or which Serotonin has the benefit of under any applicable law), this will not be taken to be a formal waiver of -Serotonins rights and that those rights or remedies will still be available to Serotonin. - -14.5 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of these Terms is -invalid, then that provision will be removed from the Terms without affecting the rest of the Terms. The remaining -provisions of the Terms will continue to be valid and enforceable. - -14.6 You acknowledge and agree that each member of the group of companies of which Serotonin is the parent shall be -third party beneficiaries to the Terms and that such other companies shall be entitled to directly enforce, and rely -upon, any provision of the Terms which confers a benefit on (or rights in favor of) them. Other than this, no other -person or company shall be third party beneficiaries to the Terms. - -14.7 The Terms, and your relationship with Serotonin under the Terms, shall be governed by the laws of the Province of -Ontario without regard to its conflict of laws provisions. You and Serotonin agree to submit to the exclusive -jurisdiction of the courts located within the Town of Markham, Ontario to resolve any legal matter arising from the -Terms. Notwithstanding this, you agree that Serotonin shall still be allowed to apply for injunctive remedies (or an -equivalent type of urgent legal relief) in any jurisdiction. - -15. Additional Terms for Extensions for Mango Automation -15.1 These terms in this section apply if you install modules on your copy of Mango Automation. Modules are small -software programs, developed by Serotonin or third parties, that can modify and enhance the functionality of Mango -Automation. Modules may have greater privileges to access your computer, including the ability to read and modify your -private data. - -15.2 From time to time, Mango Automation may check with remote servers (hosted by Serotonin or by third parties) for -available updates to modules, including but not limited to bug fixes or enhanced functionality. - -15.3 From time to time, Serotonin may discover a module that violates Serotonin developer terms or other legal -agreements, laws, regulations or policies. Mango Automation will periodically download a list of such modules from -Serotonins servers. You agree that Serotonin may remotely disable or remove any such module from user systems in its -sole discretion. - -16. Additional Terms for Enterprise Use -16.1 If you are a business entity, then the individual accepting on behalf of the entity (for the avoidance of doubt, -for business entities, in these Terms, "you" means the entity) represents and warrants that he or she has the authority -to act on your behalf, that you represent that you are duly authorized to do business in the country or countries where -you operate, and that your employees, officers, representatives, and other agents accessing the Service are duly -authorized to access Mango Automation and to legally bind you to these Terms. - -16.2 Subject to the Terms, and in addition to the license grant in Section 9, Serotonin grants you a non-exclusive, -non-transferable license to reproduce, distribute, install, and use Mango Automation solely on machines intended for -use by your employees, officers, representatives, and agents in connection with your business entity, and provided that -their use of Mango Automation will be subject to the Terms. - -March 25, 2011 +Infinite Automation Software Mango Automation Terms of Service + +These Terms of Service apply to the executable code version of Mango Automation. + +1. Your relationship with Infinite Automation +1.1 Your use of Infinite Automation�s products, software, services and web sites (referred to collectively as the �Services� in +this document and excluding any services provided to you by Infinite Automation under a separate written agreement) is subject to +the terms of a legal agreement between you and Infinite Automation. �Infinite Automation� means Infinite Automation Software Inc., whose principal +place of business is at 4383 N 119th St Lafayette, CO 80026. This document explains how the agreement is made +up, and sets out some of the terms of that agreement. + +1.2 Unless otherwise agreed in writing with Infinite Automation, your agreement with Infinite Automation will always include, at a minimum, +the terms and conditions set out in this document. These are referred to below as the �Universal Terms�. + +1.3 Your agreement with Infinite Automation will also include the terms set forth below in the Infinite Automation Mango Automation +Additional Terms of Service and terms of any Legal Notices applicable to the Services, in addition to the Universal +Terms. All of these are referred to below as the �Additional Terms�. Where Additional Terms apply to a Service, these +will be accessible for you to read either within, or through your use of, that Service. + +1.4 The Universal Terms, together with the Additional Terms, form a legally binding agreement between you and Infinite Automation +in relation to your use of the Services. It is important that you take the time to read them carefully. Collectively, +this legal agreement is referred to below as the �Terms�. + +1.5 If there is any contradiction between what the Additional Terms say and what the Universal Terms say, then the +Additional Terms shall take precedence in relation to that Service. + +2. Accepting the Terms +2.1 In order to use the Services, you must first agree to the Terms. You may not use the Services if you do not accept +the Terms. + +2.2 You can accept the Terms by: +(A) clicking to accept or agree to the Terms, where this option is made available to you by Infinite Automation in the user +interface for any Service; or + +(B) by actually using the Services. In this case, you understand and agree that Infinite Automation will treat your use of the +Services as acceptance of the Terms from that point onwards. + +3. Provision of the Services by Infinite Automation +3.1 Infinite Automation is constantly innovating in order to provide the best possible experience for its users. You acknowledge +and agree that the form and nature of the Services which Infinite Automation provides may change from time to time without prior +notice to you. + +3.2 As part of this continuing innovation, you acknowledge and agree that Infinite Automation may stop (permanently or +temporarily) providing the Services (or any features within the Services) to you or to users generally at Infinite Automation�s +sole discretion, without prior notice to you. You may stop using the Services at any time. You do not need to +specifically inform Infinite Automation when you stop using the Services. + +3.3 You acknowledge and agree that if Infinite Automation disables access to your account, you may be prevented from accessing +the Services, your account details or any files or other content which is contained in your account. + +4. Use of the Services by you +4.1 You agree to use the Services only for purposes that are permitted by (a) the Terms and (b) any applicable law, +regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding +the export of data or software to and from Canada or other relevant countries). + +4.2 You agree that you will not engage in any activity that interferes with or disrupts the Services (or the servers +and networks which are connected to the Services). + +4.3 Unless you have been specifically permitted to do so in a separate agreement with Infinite Automation, you agree that you +will not reproduce, duplicate, copy, sell, trade or resell the Services for any purpose. + +4.4 You agree that you are solely responsible for (and that Infinite Automation has no responsibility to you or to any third +party for) any breach of your obligations under the Terms and for the consequences (including any loss or damage which +Infinite Automation may suffer) of any such breach. + +5. Proprietary rights + +5.1 You acknowledge and agree that Infinite Automation (or Infinite Automation�s licensors) own all legal right, title and interest in and +to the Services, including any intellectual property rights which subsist in the Services (whether those rights happen +to be registered or not, and wherever in the world those rights may exist). + +5.2 Unless you have agreed otherwise in writing with Infinite Automation, nothing in the Terms gives you a right to use any of +Infinite Automation�s trade names, trade marks, service marks, logos, domain names, and other distinctive brand features. + +5.3 Infinite Automation acknowledges and agrees that it obtains no right, title or interest from you (or your licensors) under +these Terms in or to any Content that you submit, post, transmit or display on, or through, the Services, including any +intellectual property rights which subsist in that Content (whether those rights happen to be registered or not, and +wherever in the world those rights may exist). Unless you have agreed otherwise in writing with Infinite Automation, you agree +that you are responsible for protecting and enforcing those rights and that Infinite Automation has no obligation to do so on +your behalf. + +5.4 You agree that you shall not remove, obscure, or alter any proprietary rights notices (including copyright and +trade mark notices) which may be affixed to or contained within the Services. + +5.5 Unless you have been expressly authorized to do so in writing by Infinite Automation, you agree that in using the Services, you +will not use any trade mark, service mark, trade name, logo of any company or organization in a way that is likely or +intended to cause confusion about the owner or authorized user of such marks, names or logos. + +6. License from Infinite Automation +6.1 Infinite Automation gives you a personal, worldwide, royalty-free, non-assignable and non-exclusive license to use the +software provided to you by Infinite Automation as part of the Services as provided to you by Infinite Automation (referred to as the +�Software� below). This license is for the sole purpose of enabling you to use and enjoy the benefit of the Services as +provided by Infinite Automation, in the manner permitted by the Terms. + +6.2 Subject to section 1.2, you may not (and you may not permit anyone else to) copy, modify, create a derivative work +of, reverse engineer, decompile or otherwise attempt to extract the source code of the Software or any part thereof, +unless this is expressly permitted or required by law, or unless you have been specifically told that you may do so by +Infinite Automation, in writing. + +6.3 Subject to section 1.2, unless Infinite Automation has given you specific written permission to do so, you may not assign (or +grant a sub-license of) your rights to use the Software, grant a security interest in or over your rights to use the +Software, or otherwise transfer any part of your rights to use the Software. + +7. Content license from you +7.1 You retain copyright and any other rights you already hold in Content which you create on or through, the Services. + +8. Software updates +8.1 The Software which you use may automatically download and install updates from time to time from Infinite Automation. These +updates are designed to improve, enhance and further develop the Services and may take the form of bug fixes, enhanced +functions, new software modules and completely new versions. You agree to receive such updates (and permit Infinite Automation to +deliver these to you) as part of your use of the Services. + +9. Ending your relationship with Infinite Automation +9.1 The Terms will continue to apply until terminated by either you or Infinite Automation as set out below. + +9.2 Infinite Automation may at any time, terminate its legal agreement with you if: +(A) you have breached any provision of the Terms (or have acted in manner which clearly shows that you do not intend +to, or are unable to comply with the provisions of the Terms); or + +(B) Infinite Automation is required to do so by law (for example, where the provision of the Services to you is, or becomes, +unlawful); or + +(C) the partner with whom Infinite Automation offered the Services to you has terminated its relationship with Infinite Automation or +ceased to offer the Services to you; or + +(D) Infinite Automation is transitioning to no longer providing the Services to users in the country in which you are resident or +from which you use the service; or + +(E) the provision of the Services to you by Infinite Automation is, in Infinite Automation�s opinion, no longer commercially viable. + +9.3 Nothing in this Section shall affect Infinite Automation�s rights regarding provision of Services under Section 4 of the +Terms. + +9.4 When these Terms come to an end, all of the legal rights, obligations and liabilities that you and Infinite Automation have +benefited from, been subject to (or which have accrued over time whilst the Terms have been in force) or which are +expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall +continue to apply to such rights, obligations and liabilities indefinitely. + +10. EXCLUSION OF WARRANTIES +10.1 NOTHING IN THESE TERMS, INCLUDING SECTIONS 10 AND 11, SHALL EXCLUDE OR LIMIT INFINITE AUTOMATION�S WARRANTY OR LIABILITY FOR +LOSSES WHICH MAY NOT BE LAWFULLY EXCLUDED OR LIMITED BY APPLICABLE LAW. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF CERTAIN WARRANTIES OR CONDITIONS OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR LOSS OR DAMAGE CAUSED BY NEGLIGENCE, +BREACH OF CONTRACT OR BREACH OF IMPLIED TERMS, OR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, ONLY THE LIMITATIONS +WHICH ARE LAWFUL IN YOUR JURISDICTION WILL APPLY TO YOU AND OUR LIABILITY WILL BE LIMITED TO THE MAXIMUM EXTENT +PERMITTED BY LAW. + +10.2 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SERVICES IS AT YOUR SOLE RISK AND THAT THE SERVICES ARE +PROVIDED "AS IS" AND �AS AVAILABLE.� + +19.3 IN PARTICULAR, INFINITE AUTOMATION, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS DO NOT REPRESENT OR WARRANT TO YOU +THAT: +(A) YOUR USE OF THE SERVICES WILL MEET YOUR REQUIREMENTS, + +(B) YOUR USE OF THE SERVICES WILL BE UNINTERRUPTED, TIMELY, SECURE OR FREE FROM ERROR, + +(C) ANY INFORMATION OBTAINED BY YOU AS A RESULT OF YOUR USE OF THE SERVICES WILL BE ACCURATE OR RELIABLE, AND + +(D) THAT DEFECTS IN THE OPERATION OR FUNCTIONALITY OF ANY SOFTWARE PROVIDED TO YOU AS PART OF THE SERVICES WILL BE +CORRECTED. + +10.4 NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM INFINITE AUTOMATION OR THROUGH OR FROM THE SERVICES +SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THE TERMS. + +10.5 INFINITE AUTOMATION FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +AND NON-INFRINGEMENT. + +11. LIMITATION OF LIABILITY +11.1 SUBJECT TO OVERALL PROVISION IN PARAGRAPH 10.1 ABOVE, YOU EXPRESSLY UNDERSTAND AND AGREE THAT INFINITE AUTOMATION, ITS +SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU FOR: +(A) ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL CONSEQUENTIAL OR EXEMPLARY DAMAGES WHICH MAY BE INCURRED BY YOU, HOWEVER +CAUSED AND UNDER ANY THEORY OF LIABILITY. THIS SHALL INCLUDE, BUT NOT BE LIMITED TO, ANY LOSS OF PROFIT (WHETHER +INCURRED DIRECTLY OR INDIRECTLY), ANY LOSS OF GOODWILL OR BUSINESS REPUTATION, ANY LOSS OF DATA SUFFERED, COST OF +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR OTHER INTANGIBLE LOSS; + +(B) ANY LOSS OR DAMAGE WHICH MAY BE INCURRED BY YOU, INCLUDING BUT NOT LIMITED TO LOSS OR DAMAGE AS A RESULT OF: + +(I) ANY RELIANCE PLACED BY YOU ON THE COMPLETENESS, ACCURACY OR EXISTENCE OF ANY ADVERTISING, OR AS A RESULT OF ANY +RELATIONSHIP OR TRANSACTION BETWEEN YOU AND ANY ADVERTISER OR SPONSOR WHOSE ADVERTISING APPEARS ON THE SERVICES; + +(II) ANY CHANGES WHICH INFINITE AUTOMATION MAY MAKE TO THE SERVICES, OR FOR ANY PERMANENT OR TEMPORARY CESSATION IN THE PROVISION +OF THE SERVICES (OR ANY FEATURES WITHIN THE SERVICES); + +(III) THE DELETION OF, CORRUPTION OF, OR FAILURE TO STORE, ANY CONTENT AND OTHER COMMUNICATIONS DATA MAINTAINED OR +TRANSMITTED BY OR THROUGH YOUR USE OF THE SERVICES; + +(IV) YOUR FAILURE TO PROVIDE INFINITE AUTOMATION WITH ACCURATE ACCOUNT INFORMATION; + +(V) YOUR FAILURE TO KEEP YOUR PASSWORD OR ACCOUNT DETAILS SECURE AND CONFIDENTIAL; + +11.2 THE LIMITATIONS ON INFINITE AUTOMATION�S LIABILITY TO YOU IN PARAGRAPH 11.1 ABOVE SHALL APPLY WHETHER OR NOT INFINITE AUTOMATION HAS +BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. + +12. Copyright and trade mark policies +12.1 It is Infinite Automation�s policy to respond to notices of alleged copyright infringement that comply with applicable +international intellectual property law and to terminating the accounts of repeat infringers. + +13. Changes to the Terms +13.1 Infinite Automation may make changes to the Universal Terms or Additional Terms from time to time. When these changes are +made, Infinite Automation will make a new copy of the terms available to you from within, or through, the affected Services. + +13.2 You understand and agree that if you use the Services after the date on which the Universal Terms or Additional +Terms have changed, Infinite Automation will treat your use as acceptance of the updated Universal Terms or Additional Terms. + +14. General legal terms +14.1 Sometimes when you use the Services, you may (as a result of, or in connection with your use of the Services) use +a service or download a piece of software, or purchase goods, which are provided by another person or company. Your use +of these other services, software or goods may be subject to separate terms between you and the company or person +concerned. If so, the Terms do not affect your legal relationship with these other companies or individuals. + +14.2 The Terms constitute the whole legal agreement between you and Infinite Automation and govern your use of the Services (but +excluding any services which Infinite Automation may provide to you under a separate written agreement), and completely replace +any prior agreements between you and Infinite Automation in relation to the Services. + +14.3 You agree that Infinite Automation may provide you with notices, including those regarding changes to the Terms, by email, +regular mail, or postings on the Services. + +14.4 You agree that if Infinite Automation does not exercise or enforce any legal right or remedy which is contained in the Terms +(or which Infinite Automation has the benefit of under any applicable law), this will not be taken to be a formal waiver of +Infinite Automation�s rights and that those rights or remedies will still be available to Infinite Automation. + +14.5 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of these Terms is +invalid, then that provision will be removed from the Terms without affecting the rest of the Terms. The remaining +provisions of the Terms will continue to be valid and enforceable. + +14.6 You acknowledge and agree that each member of the group of companies of which Infinite Automation is the parent shall be +third party beneficiaries to the Terms and that such other companies shall be entitled to directly enforce, and rely +upon, any provision of the Terms which confers a benefit on (or rights in favor of) them. Other than this, no other +person or company shall be third party beneficiaries to the Terms. + +14.7 The Terms, and your relationship with Infinite Automation under the Terms, shall be governed by the laws of the Province of +Ontario without regard to its conflict of laws provisions. You and Infinite Automation agree to submit to the exclusive +jurisdiction of the courts located within the Town of Boulder, Colorado to resolve any legal matter arising from the +Terms. Notwithstanding this, you agree that Infinite Automation shall still be allowed to apply for injunctive remedies (or an +equivalent type of urgent legal relief) in any jurisdiction. + +15. Additional Terms for Extensions for Mango Automation +15.1 These terms in this section apply if you install modules on your copy of Mango Automation. Modules are small +software programs, developed by Infinite Automation or third parties, that can modify and enhance the functionality of Mango +Automation. Modules may have greater privileges to access your computer, including the ability to read and modify your +private data. + +15.2 From time to time, Mango Automation may check with remote servers (hosted by Infinite Automation or by third parties) for +available updates to modules, including but not limited to bug fixes or enhanced functionality. + +15.3 From time to time, Infinite Automation may discover a module that violates Infinite Automation developer terms or other legal +agreements, laws, regulations or policies. Mango Automation will periodically download a list of such modules from +Infinite Automation�s servers. You agree that Infinite Automation may remotely disable or remove any such module from user systems in its +sole discretion. + +16. Additional Terms for Enterprise Use +16.1 If you are a business entity, then the individual accepting on behalf of the entity (for the avoidance of doubt, +for business entities, in these Terms, "you" means the entity) represents and warrants that he or she has the authority +to act on your behalf, that you represent that you are duly authorized to do business in the country or countries where +you operate, and that your employees, officers, representatives, and other agents accessing the Service are duly +authorized to access Mango Automation and to legally bind you to these Terms. + +16.2 Subject to the Terms, and in addition to the license grant in Section 9, Infinite Automation grants you a non-exclusive, +non-transferable license to reproduce, distribute, install, and use Mango Automation solely on machines intended for +use by your employees, officers, representatives, and agents in connection with your business entity, and provided that +their use of Mango Automation will be subject to the Terms. + +March 25, 2011 diff --git a/Core/README b/Core/README deleted file mode 100644 index 7d148c7b1b..0000000000 --- a/Core/README +++ /dev/null @@ -1,2 +0,0 @@ -Mango Automation Core - diff --git a/Core/RELEASE-NOTES b/Core/RELEASE-NOTES index 78c1d0a915..d977fd42da 100644 --- a/Core/RELEASE-NOTES +++ b/Core/RELEASE-NOTES @@ -1,3 +1,41 @@ +*Version 2.5.0* +* Upgraded to Jetty 9 +* Improved JSP Performance by changing/upgrading Engine +* Added status servlet to serve Mango application Status in JSON format at /status/mango.json +* Upgraded H2 to 1.4.181 +* Upgraded Spring to 4.0.5 +* Upgraded serotonin-utils to 2.1.3 +* Added security to viewing data sources and data points so only users with proper permissions can see them +* Added additional links to Alarm Report table to allow clicking through to item of interest in event +* Added filter action to Alarm Links at top of page when multiple alarms are present +* Added list of available Units to select for each point +* Added Range Event detectors for Numeric points to alarm when values remain within or outside of a range +* Added Not higher than option to High Limit event detector +* Added Not lower than option to Low Limit event detector +* Added ability for Plain Text Renderer to use Units if defined as suffix +* Added css and favicon to url versioning system to ensure browser cache-refreshes on core updates +* Added some protective measures to ensure users with multiple tabs open don't clobber points and data sources, only 1 tab is officially supported +* Removed upgrade for MySQL PointValues table from MyISAM to InnoDB (users are expected to do this manually if desired) +* Fixed Help Window from floating around after clicking a linked help file. +* Added additional methods for scripting and meta points: (pointValuesBetween, pointValuesSince, pointValueBefore, pointValueAfter) +* Added additional method for point statistics in scripts: getStats(from, to) +* Fixed bug where Units were being squared on copy. +* Increase timeout to 20s on Alarms Report page for improved reliability on very large installations +* Fixed bug where PointHierarchy Importer was running and failing silently on every JSON Import +* Changed Point Value CSV Export format to match Excel export format +* Fix to Numeric Point Wrapper's getStats method to correctly compute the end value for the period. +* Improved database size reporting on system settings page +* Added DateTimeUtility for Meta Data Scripts +* Fixed bug where DO NOT LOG Alarm levels were being added to the Database when they Returned to normal. +* Changed Point Value import to ignore Blank and Empty XLS and XLSX rows. +* XSS (Cross Site Scripting) measures implemented +* Fixing bug in Configuration backup where name would start with file separator +* Adding ability to backup and restore H2 databases +* Fixed bug where Publisher's that failed to initialize properly were rendered un-editable + +*Version 2.4.3* +* Modified data type select tag + *Version 2.4.2* * Fixed bug when using H2 and filtering Data Points, Data Sources or Alarms tables * Changed all filtering to be case insensitive diff --git a/Core/build.properties b/Core/build.properties index 39bb9ac958..0b8f42e6ee 100644 --- a/Core/build.properties +++ b/Core/build.properties @@ -1,4 +1,5 @@ name=core # NOTE: must be changed in Common as well. Also, modify release notes accordingly -version=2.4.2 +# also, version number is pulled from pom.xml now +version=2.5.0 vendor=Infinite Automation Systems Inc., Colorado diff --git a/Core/build.xml b/Core/build.xml index 2a57273fb2..d7e356eb71 100644 --- a/Core/build.xml +++ b/Core/build.xml @@ -1,329 +1,657 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/classes/debug-log4j.xml b/Core/classes/debug-log4j.xml index f43b107393..dfb8432ad4 100644 --- a/Core/classes/debug-log4j.xml +++ b/Core/classes/debug-log4j.xml @@ -52,18 +52,23 @@ - - - + + + + + + + + diff --git a/Core/classes/env.properties b/Core/classes/env.properties index 52a824b87e..c1678b4821 100644 --- a/Core/classes/env.properties +++ b/Core/classes/env.properties @@ -21,20 +21,20 @@ web.host=0.0.0.0 # Should Mango Automation open (if possible) a browser window when it starts up? web.openBrowserOnStartup=true -# Default database settings. +# Default database settings, NOTE that on windows this must be an absolute path db.type=h2 db.url=jdbc:h2:${ma.home}/databases/mah2 db.location=${ma.home}/databases/mah2 db.port=8081 -db.username=mango -db.password=mango +db.username= +db.password= #For web console db.web.start=false db.web.port=8091 #db.type=derby -#db.url=${ma.home}/madb +#db.url=${ma.home}/databases/madb #db.username= #db.password= @@ -71,4 +71,16 @@ ssl.keystore.password=freetextpassword # System time zone. Leave blank to use default VM time zone. timezone= +#Rest API Configuration +rest.enabled=true +#For using other than timestamp +rest.customDateOutputFormat=YYYY-MM-dd HH:mm:ss.SSS Z +rest.customDateInputFormat=YYYY-MM-dd HH:mm:ss.SSS Z + +#For rest API Documentation at /swagger/index.html +swagger.enabled=false +swagger.mangoApiVersion=v1 + + +#Distributor Settings distributor=IA diff --git a/Core/classes/i18n.properties b/Core/classes/i18n.properties index d726cdfb97..d1792106f2 100644 --- a/Core/classes/i18n.properties +++ b/Core/classes/i18n.properties @@ -293,8 +293,10 @@ dox.emport=Importing and Exporting configuration dox.colourSettings=Colour settings dox.colours=Colours dox.backupSettings=Backup Settings +dox.databaseBackup=Database Backup dox.eventReport=Alarm Report dox.chartServlet=Chart Servlet +dox.chartSettings=Chart Settings ftl.userTestEmail=This message was sent as a test of the email address for user {0} ftl.automatedEmail=This email was sent by an automated service. Please do not respond. @@ -874,11 +876,30 @@ pointEdit.detectors.negCusumDet=Negative CUSUM detector pointEdit.detectors.negCusum=Negative CUSUM pointEdit.detectors.negLimit=Negative limit pointEdit.detectors.weight=Weight - +pointEdit.detectors.range=Range +pointEdit.detectors.analogChange=Analog Change +pointEdit.detectors.rangeDet=Range detector +pointEdit.detectors.rangeHigh=High range limit +pointEdit.detectors.rangeLow=Low range limit +pointEdit.detectors.errorParsingHighLimit=Error parsing low range value +pointEdit.detectors.errorParsingLowLimit=Error parsing high range value +pointEdit.detectors.withinRange=Within range +pointEdit.detectors.outsideRange=Outside range +pointEdit.detectors.higher=Greater than +pointEdit.detectors.notHigher=Less than or equal to +pointEdit.detectors.lower=Less than +pointEdit.detectors.notLower=Greater than or equal to +pointEdit.detectors.resetLimit=Reset limit +pointEdit.detectors.useResetLimit= Use reset limit +pointEdit.detectors.errorParsingResetLimit=Error parsing reset limit +pointEdit.detectors.resetLimitMustBeGreaterThanLimit=Reset limit must be >= Limit +pointEdit.detectors.resetLimitMustBeLessThanLimit=Reset limit must be <= Limit pointEdit.error.missingDataPoint=Missing data point, was it deleted? pointEdit.error.general=Error loading data point information. +pointEdit.error.uiPointMismatch=Data Point save failed due to wrong point referenced, are you using multiple tabs? + pointEdit.logging.props=Logging properties pointEdit.logging.type=Logging type pointEdit.logging.type.change=When point value changes @@ -953,6 +974,8 @@ pointEdit.text.errorParsingFrom=Error parsing From value pointEdit.text.errorParsingTo=Error parsing To value pointEdit.text.toGreaterThanFrom=From value must be less than the To value pointEdit.text.listContainsRange=List already contains the range +#Deprecated, but left in as it still exists in the code when data point is created +pointEdit.props.engineeringUnits=Engineering Units publisherEdit.saved=Publisher has been saved publisherEdit.currentAlarms=Current alarms @@ -1061,9 +1084,17 @@ systemSettings.plotGridlinesColour=Plot gridline systemSettings.validation.invalidColour=Invalid colour systemSettings.timezone=Time zone systemSettings.backupSettings=Configuration Backup Settings +systemSettings.databaseBackupSettings=Database Backup Settings +systemSettings.restoreDatabase=Restore database +systemSettings.confirmRestoreDatabase=Really overwrite existing database? +systemSettings.databaseRestored=Database restored +systemSettings.databaseRestoreNotSupported=Database restore not supported for type: {0} +systemSettings.getBackupFiles=Get backups +systemSettings.noBackupSelected=No backup selected systemSettings.backupLocation=Backup directory systemSettings.backupFrequency=Backup every systemSettings.systemBackupSettingsSaved=System backup settings have been saved +systemSettings.databaseBackupSettingsSaved=Database backup settings have been saved systemSettings.backupNow=Backup now systemSettings.backupQueued=Backup queued to run now systemSettings.backupTime=Backup time @@ -1078,6 +1109,14 @@ systemSettings.validation.backupLocationNotExists=Backup location does not exist systemSettings.validation.backupHourInvalid=Hour must be 0-23 systemSettings.validation.backupMinuteInvalid=Minute must be 0-59 systemSettings.validation.backupFileCountInvalid=History must be > 0 +systemSettings.validation.cannotWriteToDatabaseBackupFileLocation=Unable to write to backup file location +systemSettings.validation.databaseBackupLocationNotExists=Backup location does not exist +systemSettings.validation.databaseBackupHourInvalid=Hour must be 0-23 +systemSettings.validation.databaseBackupMinuteInvalid=Minute must be 0-59 +systemSettings.validation.databaseBackupFileCountInvalid=History must be > 0 +systemSettings.chartSettings=Chart API Settings +systemSettings.allowAnonymousChartView=Allow anonymous access to chart API +systemSettings.systemChartSettingsSaved=Chart API settings saved table.confirmDelete.DataSource=Really delete this data source? table.confirmDelete.DataPoint=Really delete this data point? @@ -1231,6 +1270,7 @@ event.audit.recip.list.28={0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10} event.audit.recip.list.29={0}, {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} event.audit.recip.list.30={0}, {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} +event.pollAborted=Data source with xid: {0} and name: {1}, aborted {2} polls. event.exception2={0}: {1} event.initializationError=Initialization error: {0} event.setPointFailed=Set point failed: {0} @@ -1269,10 +1309,16 @@ event.detector.highLimit={0} has exceeded {1} event.detector.highLimitPeriod={0} has exceeded {1} for more than {2} event.detector.lowLimit={0} is below {1} event.detector.lowLimitPeriod={0} has been below {1} for more than {2} +event.detector.highLimitNotHigher={0} has not exceeded {1} +event.detector.highLimitNotHigherPeriod={0} has not exceeded {1} for more than {2} +event.detector.lowLimitNotLower={0} is not below {1} +event.detector.lowLimitNotLowerPeriod={0} has not been below {1} for more than {2} event.detector.change={0} has changed state {1} times within {2} event.detector.noChange={0} has not changed for over {1} event.detector.noUpdate={0} has not been updated for over {1} event.detector.changeCount={0} has changed from "{1}" to "{2}" +event.detector.changeCountUser={0} was changed from "{1}" to "{2}" by user "{3}" +event.detector.changeCountAnnotation={0} has changed from "{1}" to "{2}" with annotation "{3}" event.detector.posCusum={0} CUSUM has exceeded {1} event.detector.posCusumPeriod={0} CUSUM has exceeded {1} for more than {2} event.detector.negCusum={0} CUSUM is below {1} @@ -1282,11 +1328,19 @@ event.viconics.messagingException=Messaging error: {0} event.viconics.networkOffline=Network is offline event.viconics.deviceOffline=Device is offline: {0} event.viconics.duplicateCommException=Duplicate comm address detected: {0} +event.detector.range={0} is between {1} and {2} +event.detector.rangePeriod={0} has been between {1} and {2} for more than {3} +event.detector.rangeOutside={0} is outside of {1} and {2} +event.detector.rangeOutsidePeriod={0} has been outside of {1} and {2} for more than {3} event.detectorVo.highLimit=When value is higher than {0} event.detectorVo.highLimitPeriod=When value is higher than {0} for {1} event.detectorVo.lowLimit=When value is lower than {0} event.detectorVo.lowLimitPeriod=When value is lower than {0} for {1} +event.detectorVo.highLimitNotHigher=When value is not higher {0} +event.detectorVo.highLimitNotHigherPeriod=When value is not higher than {0} for {1} +event.detectorVo.lowLimitNotLower=When value is not lower than {0} +event.detectorVo.lowLimitNotLowerPeriod=When value is not lower than {0} for {1} event.detectorVo.state=When state is {0} event.detectorVo.statePeriod=When state is {0} for {1} event.detectorVo.change=When value changes @@ -1297,6 +1351,10 @@ event.detectorVo.posCusum=When CUSUM is higher than {0} event.detectorVo.posCusumPeriod=When CUSUM is higher than {0} for {1} event.detectorVo.negCusum=When CUSUM is lower than {0} event.detectorVo.negCusumPeriod=When CUSUM is lower than {0} for {1} +event.detectorVo.range=When value is between {0} and {1} +event.detectorVo.rangePeriod=When value is between {0} and {1} for {2} +event.detectorVo.range=When value is outside of {0} and {1} +event.detectorVo.rangePeriod=When value is outside of {0} and {1} for {2} event.setPoint.targetPointMissing=target point is missing or disabled event.setPoint.targetNotSettable=target point is not settable @@ -1352,7 +1410,8 @@ event.ds.heartbeat=Sensor heartbeat event.ds.unknownSensor=Unknown sensor event.ds.statement=Statement exception event.ds.logError=Log error -event.report=Alarm Report [Beta] +event.ds.pollAborted=Poll aborted +event.report=Alarm Report event.legacyAlarmsPage=Legacy Alarms Page event.backup.failure=Backup Failed for File: {0} because {1} @@ -1453,7 +1512,8 @@ emport.error.parseError=Error parsing ''{0}'' emport.error.deleteNew=Unable to delete non-existant entry: {0} emport.error.unableToDeleteDueToConstraints=Unable to delete entry: {0}, due to database constraints emport.error.unableToDelete=Unable to delete entry: {0} -emport.error.xidRequired=XID not provided but is required +emport.error.xidRequired=XID not provided but is required +emport.error.dataValue.null=Data value is missing internal.monitor.BATCH_ENTRIES=Point values to be written internal.monitor.BATCH_INSTANCES=Point value write threads @@ -1507,6 +1567,7 @@ startup.state.eventManagerInitialize=Initializing Event Manager startup.state.runtimeManagerInitialize=Initializing Data Sources startup.state.maintenanceInitialize=Initializing Maintenance System startup.state.imageSetInitialize=Initializing Web Image Set +startup.state.webServerFinalize=Finalizing Web Sever Configuration startup.state.startupTasksRunning=Running Startup Tasks startup.state.postInitialize=Final Module Initialization startup.state.running=Mango Running diff --git a/Core/classes/swagger.properties b/Core/classes/swagger.properties new file mode 100644 index 0000000000..59eaae32e4 --- /dev/null +++ b/Core/classes/swagger.properties @@ -0,0 +1,2 @@ +documentation.services.basePath=http://localhost:8080/ +documentation.services.version=1.0 \ No newline at end of file diff --git a/Core/db/createTables-DERBY.sql b/Core/db/createTables-DERBY.sql index 83ed55b125..f2abcfd47e 100644 --- a/Core/db/createTables-DERBY.sql +++ b/Core/db/createTables-DERBY.sql @@ -260,3 +260,20 @@ create table publishers ( ); alter table publishers add constraint publishersPk primary key (id); alter table publishers add constraint publishersUn1 unique (xid); + +-- +-- +-- Compound events detectors +-- +-- create table compoundEventDetectors ( +-- id int not null generated by default as identity (start with 1, increment by 1), +-- xid varchar(50) not null, +-- name varchar(100), +-- alarmLevel int not null, +-- returnToNormal char(1) not null, +-- disabled char(1) not null, +-- conditionText varchar(256) not null +-- ); +-- alter table compoundEventDetectors add constraint compoundEventDetectorsPk primary key (id); +-- alter table compoundEventDetectors add constraint compoundEventDetectorsUn1 unique (xid); + diff --git a/Core/db/createTables-H2.sql b/Core/db/createTables-H2.sql index 3ae37915de..da40353a57 100644 --- a/Core/db/createTables-H2.sql +++ b/Core/db/createTables-H2.sql @@ -1,257 +1,273 @@ --- --- Copyright (C) 2014 Infinite Automation Systems Inc. All rights reserved. --- @author Matthew Lohbihler --- --- - --- --- System settings -CREATE TABLE systemSettings ( - settingName varchar(64) NOT NULL, - settingValue longtext, - PRIMARY KEY (settingName) -); - - --- --- Users -CREATE TABLE users ( - id int NOT NULL auto_increment, - username varchar(40) NOT NULL, - password varchar(30) NOT NULL, - email varchar(255), - phone varchar(40), - admin char(1) NOT NULL, - disabled char(1) NOT NULL, - lastLogin bigint, - homeUrl varchar(255), - receiveAlarmEmails int NOT NULL, - receiveOwnAuditEvents char(1) NOT NULL, - timezone varchar(50), - muted char(1), - PRIMARY KEY (id) -); - -CREATE TABLE userComments ( - userId int, - commentType int NOT NULL, - typeKey int NOT NULL, - ts bigint NOT NULL, - commentText varchar(1024) NOT NULL -); -ALTER TABLE userComments ADD CONSTRAINT userCommentsFk1 FOREIGN KEY (userId) REFERENCES users(id); - - --- --- Mailing lists -CREATE TABLE mailingLists ( - id int NOT NULL auto_increment, - xid varchar(50) NOT NULL, - name varchar(255) NOT NULL, - PRIMARY KEY (id) -); -ALTER TABLE mailingLists ADD CONSTRAINT mailingListsUn1 UNIQUE (xid); - -CREATE TABLE mailingListInactive ( - mailingListId int NOT NULL, - inactiveInterval int NOT NULL -); -ALTER TABLE mailingListInactive ADD CONSTRAINT mailingListInactiveFk1 FOREIGN KEY (mailingListId) - REFERENCES mailingLists(id) ON DELETE CASCADE; - -CREATE TABLE mailingListMembers ( - mailingListId int NOT NULL, - typeId int NOT NULL, - userId int, - address varchar(255) -); -ALTER TABLE mailingListMembers ADD CONSTRAINT mailingListMembersFk1 FOREIGN KEY (mailingListId) - REFERENCES mailingLists(id) ON DELETE CASCADE; - - --- --- Data Sources -CREATE TABLE dataSources ( - id int NOT NULL auto_increment, - xid varchar(50) NOT NULL, - name varchar(255) NOT NULL, - dataSourceType varchar(40) NOT NULL, - data longblob NOT NULL, - rtdata longblob, - PRIMARY KEY (id) -); -ALTER TABLE dataSources ADD CONSTRAINT dataSourcesUn1 UNIQUE (xid); - - --- Data source permissions -CREATE TABLE dataSourceUsers ( - dataSourceId int NOT NULL, - userId int NOT NULL -); -ALTER TABLE dataSourceUsers ADD CONSTRAINT dataSourceUsersFk1 FOREIGN KEY (dataSourceId) REFERENCES dataSources(id); -ALTER TABLE dataSourceUsers ADD CONSTRAINT dataSourceUsersFk2 FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE; - - --- --- Data Points -CREATE TABLE dataPoints ( - id int NOT NULL auto_increment, - xid varchar(50) NOT NULL, - dataSourceId int NOT NULL, - name varchar(255), - deviceName varchar(255), - enabled char(1), - pointFolderId int, - loggingType int, - intervalLoggingPeriodType int, - intervalLoggingPeriod int, - intervalLoggingType int, - tolerance double, - purgeOverride char(1), - purgeType int, - purgePeriod int, - defaultCacheSize int, - discardExtremeValues char(1), - engineeringUnits int, - data longblob NOT NULL, - PRIMARY KEY (id) -); -ALTER TABLE dataPoints ADD CONSTRAINT dataPointsUn1 UNIQUE (xid); -ALTER TABLE dataPoints ADD CONSTRAINT dataPointsFk1 FOREIGN KEY (dataSourceId) REFERENCES dataSources(id); - --- Data point hierarchy -CREATE TABLE dataPointHierarchy ( - id int NOT NULL, - parentId int, - name varchar(100) -); -ALTER TABLE dataPointHierarchy ADD CONSTRAINT dataPointHierarchyPk PRIMARY KEY (id); - --- Data point permissions -CREATE TABLE dataPointUsers ( - dataPointId int NOT NULL, - userId int NOT NULL, - permission int NOT NULL -); -ALTER TABLE dataPointUsers ADD CONSTRAINT dataPointUsersFk1 FOREIGN KEY (dataPointId) REFERENCES dataPoints(id); -ALTER TABLE dataPointUsers ADD CONSTRAINT dataPointUsersFk2 FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE; - - --- --- --- Point Values (historical data) --- -CREATE TABLE pointValues ( - id bigint NOT NULL auto_increment, - dataPointId int NOT NULL, - dataType int NOT NULL, - pointValue double, - ts bigint NOT NULL, - PRIMARY KEY (id) -); -CREATE index pointValuesIdx1 on pointValues (dataPointId, ts); - -CREATE TABLE pointValueAnnotations ( - pointValueId bigint NOT NULL, - textPointValueShort varchar(128), - textPointValueLong longtext, - sourceMessage longtext, - PRIMARY KEY (pointValueId) -); - - --- --- --- Point event detectors --- -CREATE TABLE pointEventDetectors ( - id int NOT NULL auto_increment, - xid varchar(50) NOT NULL, - alias varchar(255), - dataPointId int NOT NULL, - detectorType int NOT NULL, - alarmLevel int NOT NULL, - stateLimit double, - duration int, - durationType int, - binaryState char(1), - multistateState int, - changeCount int, - alphanumericState varchar(128), - weight double, - PRIMARY KEY (id) -); -ALTER TABLE pointEventDetectors ADD CONSTRAINT pointEventDetectorsUn1 UNIQUE (xid, dataPointId); -ALTER TABLE pointEventDetectors ADD CONSTRAINT pointEventDetectorsFk1 FOREIGN KEY (dataPointId) - REFERENCES dataPoints(id); - - --- --- --- Events --- -CREATE TABLE events ( - id int NOT NULL auto_increment, - typeName varchar(32) NOT NULL, - subtypeName varchar(32), - typeRef1 int NOT NULL, - typeRef2 int NOT NULL, - activeTs bigint NOT NULL, - rtnApplicable char(1) NOT NULL, - rtnTs bigint, - rtnCause int, - alarmLevel int NOT NULL, - message longtext, - ackTs bigint, - ackUserId int, - alternateAckSource longtext, - PRIMARY KEY (id) -); -ALTER TABLE events ADD CONSTRAINT eventsFk1 FOREIGN KEY (ackUserId) REFERENCES users(id); -CREATE INDEX events_performance1 ON events (`activeTs` ASC); - -CREATE TABLE userEvents ( - eventId int NOT NULL, - userId int NOT NULL, - silenced char(1) NOT NULL, - PRIMARY KEY (eventId, userId) -); -ALTER TABLE userEvents ADD CONSTRAINT userEventsFk1 FOREIGN KEY (eventId) REFERENCES events(id) ON DELETE CASCADE; -ALTER TABLE userEvents ADD CONSTRAINT userEventsFk2 FOREIGN KEY (userId) REFERENCES users(id); -CREATE INDEX userEvents_performance1 ON userEvents (`userId` ASC, `silenced` ASC); - --- --- --- Event handlers --- -CREATE TABLE eventHandlers ( - id int NOT NULL auto_increment, - xid varchar(50) NOT NULL, - alias varchar(255), - - -- Event type, see events - eventTypeName varchar(32) NOT NULL, - eventSubtypeName varchar(32), - eventTypeRef1 int NOT NULL, - eventTypeRef2 int NOT NULL, - - data longblob NOT NULL, - PRIMARY KEY (id) -); -ALTER TABLE eventHandlers ADD CONSTRAINT eventHandlersUn1 UNIQUE (xid); - - --- --- --- Publishers --- -CREATE TABLE publishers ( - id int NOT NULL auto_increment, - xid varchar(50) NOT NULL, - publisherType varchar(40) NOT NULL, - data longblob NOT NULL, - rtdata longblob, - tags longtext, - PRIMARY KEY (id) -); -ALTER TABLE publishers ADD CONSTRAINT publishersUn1 UNIQUE (xid); +-- +-- Copyright (C) 2014 Infinite Automation Systems Inc. All rights reserved. +-- @author Matthew Lohbihler +-- +-- + +-- +-- System settings +CREATE TABLE systemSettings ( + settingName varchar(64) NOT NULL, + settingValue longtext, + PRIMARY KEY (settingName) +); + + +-- +-- Users +CREATE TABLE users ( + id int NOT NULL auto_increment, + username varchar(40) NOT NULL, + password varchar(30) NOT NULL, + email varchar(255), + phone varchar(40), + admin char(1) NOT NULL, + disabled char(1) NOT NULL, + lastLogin bigint, + homeUrl varchar(255), + receiveAlarmEmails int NOT NULL, + receiveOwnAuditEvents char(1) NOT NULL, + timezone varchar(50), + muted char(1), + PRIMARY KEY (id) +); + +CREATE TABLE userComments ( + userId int, + commentType int NOT NULL, + typeKey int NOT NULL, + ts bigint NOT NULL, + commentText varchar(1024) NOT NULL +); +ALTER TABLE userComments ADD CONSTRAINT userCommentsFk1 FOREIGN KEY (userId) REFERENCES users(id); + + +-- +-- Mailing lists +CREATE TABLE mailingLists ( + id int NOT NULL auto_increment, + xid varchar(50) NOT NULL, + name varchar(255) NOT NULL, + PRIMARY KEY (id) +); +ALTER TABLE mailingLists ADD CONSTRAINT mailingListsUn1 UNIQUE (xid); + +CREATE TABLE mailingListInactive ( + mailingListId int NOT NULL, + inactiveInterval int NOT NULL +); +ALTER TABLE mailingListInactive ADD CONSTRAINT mailingListInactiveFk1 FOREIGN KEY (mailingListId) + REFERENCES mailingLists(id) ON DELETE CASCADE; + +CREATE TABLE mailingListMembers ( + mailingListId int NOT NULL, + typeId int NOT NULL, + userId int, + address varchar(255) +); +ALTER TABLE mailingListMembers ADD CONSTRAINT mailingListMembersFk1 FOREIGN KEY (mailingListId) + REFERENCES mailingLists(id) ON DELETE CASCADE; + + +-- +-- Data Sources +CREATE TABLE dataSources ( + id int NOT NULL auto_increment, + xid varchar(50) NOT NULL, + name varchar(255) NOT NULL, + dataSourceType varchar(40) NOT NULL, + data longblob NOT NULL, + rtdata longblob, + PRIMARY KEY (id) +); +ALTER TABLE dataSources ADD CONSTRAINT dataSourcesUn1 UNIQUE (xid); + + +-- Data source permissions +CREATE TABLE dataSourceUsers ( + dataSourceId int NOT NULL, + userId int NOT NULL +); +ALTER TABLE dataSourceUsers ADD CONSTRAINT dataSourceUsersFk1 FOREIGN KEY (dataSourceId) REFERENCES dataSources(id); +ALTER TABLE dataSourceUsers ADD CONSTRAINT dataSourceUsersFk2 FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE; + + +-- +-- Data Points +CREATE TABLE dataPoints ( + id int NOT NULL auto_increment, + xid varchar(50) NOT NULL, + dataSourceId int NOT NULL, + name varchar(255), + deviceName varchar(255), + enabled char(1), + pointFolderId int, + loggingType int, + intervalLoggingPeriodType int, + intervalLoggingPeriod int, + intervalLoggingType int, + tolerance double, + purgeOverride char(1), + purgeType int, + purgePeriod int, + defaultCacheSize int, + discardExtremeValues char(1), + engineeringUnits int, + data longblob NOT NULL, + PRIMARY KEY (id) +); +ALTER TABLE dataPoints ADD CONSTRAINT dataPointsUn1 UNIQUE (xid); +ALTER TABLE dataPoints ADD CONSTRAINT dataPointsFk1 FOREIGN KEY (dataSourceId) REFERENCES dataSources(id); + +-- Data point hierarchy +CREATE TABLE dataPointHierarchy ( + id int NOT NULL, + parentId int, + name varchar(100) +); +ALTER TABLE dataPointHierarchy ADD CONSTRAINT dataPointHierarchyPk PRIMARY KEY (id); + +-- Data point permissions +CREATE TABLE dataPointUsers ( + dataPointId int NOT NULL, + userId int NOT NULL, + permission int NOT NULL +); +ALTER TABLE dataPointUsers ADD CONSTRAINT dataPointUsersFk1 FOREIGN KEY (dataPointId) REFERENCES dataPoints(id); +ALTER TABLE dataPointUsers ADD CONSTRAINT dataPointUsersFk2 FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE; + + +-- +-- +-- Point Values (historical data) +-- +CREATE TABLE pointValues ( + id bigint NOT NULL auto_increment, + dataPointId int NOT NULL, + dataType int NOT NULL, + pointValue double, + ts bigint NOT NULL, + PRIMARY KEY (id) +); +CREATE index pointValuesIdx1 on pointValues (dataPointId, ts); + +CREATE TABLE pointValueAnnotations ( + pointValueId bigint NOT NULL, + textPointValueShort varchar(128), + textPointValueLong longtext, + sourceMessage longtext, + PRIMARY KEY (pointValueId) +); + + +-- +-- +-- Point event detectors +-- +CREATE TABLE pointEventDetectors ( + id int NOT NULL auto_increment, + xid varchar(50) NOT NULL, + alias varchar(255), + dataPointId int NOT NULL, + detectorType int NOT NULL, + alarmLevel int NOT NULL, + stateLimit double, + duration int, + durationType int, + binaryState char(1), + multistateState int, + changeCount int, + alphanumericState varchar(128), + weight double, + PRIMARY KEY (id) +); +ALTER TABLE pointEventDetectors ADD CONSTRAINT pointEventDetectorsUn1 UNIQUE (xid, dataPointId); +ALTER TABLE pointEventDetectors ADD CONSTRAINT pointEventDetectorsFk1 FOREIGN KEY (dataPointId) + REFERENCES dataPoints(id); + + +-- +-- +-- Events +-- +CREATE TABLE events ( + id int NOT NULL auto_increment, + typeName varchar(32) NOT NULL, + subtypeName varchar(32), + typeRef1 int NOT NULL, + typeRef2 int NOT NULL, + activeTs bigint NOT NULL, + rtnApplicable char(1) NOT NULL, + rtnTs bigint, + rtnCause int, + alarmLevel int NOT NULL, + message longtext, + ackTs bigint, + ackUserId int, + alternateAckSource longtext, + PRIMARY KEY (id) +); +ALTER TABLE events ADD CONSTRAINT eventsFk1 FOREIGN KEY (ackUserId) REFERENCES users(id); +CREATE INDEX events_performance1 ON events (`activeTs` ASC); + +CREATE TABLE userEvents ( + eventId int NOT NULL, + userId int NOT NULL, + silenced char(1) NOT NULL, + PRIMARY KEY (eventId, userId) +); +ALTER TABLE userEvents ADD CONSTRAINT userEventsFk1 FOREIGN KEY (eventId) REFERENCES events(id) ON DELETE CASCADE; +ALTER TABLE userEvents ADD CONSTRAINT userEventsFk2 FOREIGN KEY (userId) REFERENCES users(id); +CREATE INDEX userEvents_performance1 ON userEvents (`userId` ASC, `silenced` ASC); + +-- +-- +-- Event handlers +-- +CREATE TABLE eventHandlers ( + id int NOT NULL auto_increment, + xid varchar(50) NOT NULL, + alias varchar(255), + + -- Event type, see events + eventTypeName varchar(32) NOT NULL, + eventSubtypeName varchar(32), + eventTypeRef1 int NOT NULL, + eventTypeRef2 int NOT NULL, + + data longblob NOT NULL, + PRIMARY KEY (id) +); +ALTER TABLE eventHandlers ADD CONSTRAINT eventHandlersUn1 UNIQUE (xid); + + +-- +-- +-- Publishers +-- +CREATE TABLE publishers ( + id int NOT NULL auto_increment, + xid varchar(50) NOT NULL, + publisherType varchar(40) NOT NULL, + data longblob NOT NULL, + rtdata longblob, + tags longtext, + PRIMARY KEY (id) +); +ALTER TABLE publishers ADD CONSTRAINT publishersUn1 UNIQUE (xid); + +-- +-- +-- Compound events detectors +-- +-- create table compoundEventDetectors ( +-- id int not null auto_increment, +-- xid varchar(50) not null, +-- name varchar(100), +-- alarmLevel int not null, +-- returnToNormal char(1) not null, +-- disabled char(1) not null, +-- conditionText varchar(256) not null, +-- primary key (id) +-- ); +-- alter table compoundEventDetectors add constraint compoundEventDetectorsUn1 unique (xid); diff --git a/Core/db/createTables-MSSQL.sql b/Core/db/createTables-MSSQL.sql index 4448be0c01..e4bcacfd42 100644 --- a/Core/db/createTables-MSSQL.sql +++ b/Core/db/createTables-MSSQL.sql @@ -258,3 +258,20 @@ create table publishers ( primary key (id) ); alter table publishers add constraint publishersUn1 unique (xid); + +-- +-- +-- Compound events detectors +-- +-- create table compoundEventDetectors ( +-- id int not null identity, +-- xid nvarchar(50) not null, +-- name nvarchar(100), +-- alarmLevel int not null, +-- returnToNormal char(1) not null, +-- disabled char(1) not null, +-- conditionText nvarchar(256) not null, +-- primary key (id) +-- ); +-- alter table compoundEventDetectors add constraint compoundEventDetectorsUn1 unique (xid); + diff --git a/Core/db/createTables-MYSQL.sql b/Core/db/createTables-MYSQL.sql index f6b9d90236..ee35f00068 100644 --- a/Core/db/createTables-MYSQL.sql +++ b/Core/db/createTables-MYSQL.sql @@ -219,6 +219,8 @@ create table events ( primary key (id) ) engine=InnoDB; alter table events add constraint eventsFk1 foreign key (ackUserId) references users(id); +alter table events add index performance1 (activeTs ASC); + create table userEvents ( eventId int not null, @@ -228,7 +230,7 @@ create table userEvents ( ) engine=InnoDB; alter table userEvents add constraint userEventsFk1 foreign key (eventId) references events(id) on delete cascade; alter table userEvents add constraint userEventsFk2 foreign key (userId) references users(id); - +alter table userEvents add index performance1 (userId ASC, silenced ASC); -- -- @@ -264,3 +266,20 @@ create table publishers ( primary key (id) ) engine=InnoDB; alter table publishers add constraint publishersUn1 unique (xid); + +-- +-- +-- Compound events detectors +-- +-- create table compoundEventDetectors ( +-- id int not null auto_increment, +-- xid varchar(50) not null, +-- name varchar(100), +-- alarmLevel int not null, +-- returnToNormal char(1) not null, +-- disabled char(1) not null, +-- conditionText varchar(256) not null, +-- primary key (id) +-- ) engine=InnoDB; +-- alter table compoundEventDetectors add constraint compoundEventDetectorsUn1 unique (xid); + diff --git a/Core/db/createTables-POSTGRES.sql b/Core/db/createTables-POSTGRES.sql index 7c3f2c78cb..7d7fb74ff8 100644 --- a/Core/db/createTables-POSTGRES.sql +++ b/Core/db/createTables-POSTGRES.sql @@ -261,3 +261,20 @@ CREATE TABLE publishers ( PRIMARY KEY (id) ); ALTER TABLE publishers ADD CONSTRAINT publishersUn1 UNIQUE (xid); + +-- +-- +-- Compound events detectors +-- +-- CREATE TABLE compoundEventDetectors ( +-- id SERIAL, +-- xid varchar(50) NOT NULL, +-- name varchar(100), +-- alarmLevel int not null, +-- returnToNormal char(1) not null, +-- disabled char(1) not null, +-- conditionText varchar(256) not null, +-- primary key (id) +-- ); +-- alter table compoundEventDetectors add constraint compoundEventDetectorsUn1 unique (xid); + diff --git a/Core/dojo-build/dist/dgrid/dgrid.js.uncompressed.js b/Core/dojo-build/dist/dgrid/dgrid.js.uncompressed.js index 05630decc1..27dab81234 100644 --- a/Core/dojo-build/dist/dgrid/dgrid.js.uncompressed.js +++ b/Core/dojo-build/dist/dgrid/dgrid.js.uncompressed.js @@ -7343,167 +7343,167 @@ define(["./aspect", "./on"], function(aspect, on){ }, 'dgrid/util/misc':function(){ -define(["put-selector/put"], function(put){ - // summary: - // This module defines miscellaneous utility methods for purposes of - // adding styles, and throttling/debouncing function calls. - - // establish an extra stylesheet which addCssRule calls will use, - // plus an array to track actual indices in stylesheet for removal - var extraRules = [], - extraSheet, - removeMethod, - rulesProperty, - invalidCssChars = /([^A-Za-z0-9_\u00A0-\uFFFF-])/g; - - function removeRule(index){ - // Function called by the remove method on objects returned by addCssRule. - var realIndex = extraRules[index], - i, l; - if (realIndex === undefined) { return; } // already removed - - // remove rule indicated in internal array at index - extraSheet[removeMethod](realIndex); - - // Clear internal array item representing rule that was just deleted. - // NOTE: we do NOT splice, since the point of this array is specifically - // to negotiate the splicing that occurs in the stylesheet itself! - extraRules[index] = undefined; - - // Then update array items as necessary to downshift remaining rule indices. - // Can start at index + 1, since array is sparse but strictly increasing. - for(i = index + 1, l = extraRules.length; i < l; i++){ - if(extraRules[i] > realIndex){ extraRules[i]--; } - } - } - - var util = { - // Throttle/debounce functions - - defaultDelay: 15, - throttle: function(cb, context, delay){ - // summary: - // Returns a function which calls the given callback at most once per - // delay milliseconds. (Inspired by plugd) - var ran = false; - delay = delay || util.defaultDelay; - return function(){ - if(ran){ return; } - ran = true; - cb.apply(context, arguments); - setTimeout(function(){ ran = false; }, delay); - }; - }, - throttleDelayed: function(cb, context, delay){ - // summary: - // Like throttle, except that the callback runs after the delay, - // rather than before it. - var ran = false; - delay = delay || util.defaultDelay; - return function(){ - if(ran){ return; } - ran = true; - var a = arguments; - setTimeout(function(){ - ran = false; - cb.apply(context, a); - }, delay); - }; - }, - debounce: function(cb, context, delay){ - // summary: - // Returns a function which calls the given callback only after a - // certain time has passed without successive calls. (Inspired by plugd) - var timer; - delay = delay || util.defaultDelay; - return function(){ - if(timer){ - clearTimeout(timer); - timer = null; - } - var a = arguments; - timer = setTimeout(function(){ - cb.apply(context, a); - }, delay); - }; - }, - - // Iterative functions - - each: function(arrayOrObject, callback, context){ - // summary: - // Given an array or object, iterates through its keys. - // Does not use hasOwnProperty (since even Dojo does not - // consistently use it), but will iterate using a for or for-in - // loop as appropriate. - - var i, len; - - if(!arrayOrObject){ - return; - } - - if(typeof arrayOrObject.length === "number"){ - for(i = 0, len = arrayOrObject.length; i < len; i++){ - callback.call(context, arrayOrObject[i], i, arrayOrObject); - } - }else{ - for(i in arrayOrObject){ - callback.call(context, arrayOrObject[i], i, arrayOrObject); - } - } - }, - - // CSS-related functions - - addCssRule: function(selector, css){ - // summary: - // Dynamically adds a style rule to the document. Returns an object - // with a remove method which can be called to later remove the rule. - - if(!extraSheet){ - // First time, create an extra stylesheet for adding rules - extraSheet = put(document.getElementsByTagName("head")[0], "style"); - // Keep reference to actual StyleSheet object (`styleSheet` for IE < 9) - extraSheet = extraSheet.sheet || extraSheet.styleSheet; - // Store name of method used to remove rules (`removeRule` for IE < 9) - removeMethod = extraSheet.deleteRule ? "deleteRule" : "removeRule"; - // Store name of property used to access rules (`rules` for IE < 9) - rulesProperty = extraSheet.cssRules ? "cssRules" : "rules"; - } - - var index = extraRules.length; - extraRules[index] = (extraSheet.cssRules || extraSheet.rules).length; - extraSheet.addRule ? - extraSheet.addRule(selector, css) : - extraSheet.insertRule(selector + '{' + css + '}', extraRules[index]); - - return { - get: function(prop) { - return extraSheet[rulesProperty][extraRules[index]].style[prop]; - }, - set: function(prop, value) { - if (typeof extraRules[index] !== "undefined") { - extraSheet[rulesProperty][extraRules[index]].style[prop] = value; - } - }, - remove: function(){ - removeRule(index); - } - }; - }, - - escapeCssIdentifier: function(id){ - // summary: - // Escapes normally-invalid characters in a CSS identifier (such as .); - // see http://www.w3.org/TR/CSS2/syndata.html#value-def-identifier - // id: String - // CSS identifier (e.g. tag name, class, or id) to be escaped - - return id.replace(invalidCssChars, "\\$1"); - } - }; - return util; +define(["put-selector/put"], function(put){ + // summary: + // This module defines miscellaneous utility methods for purposes of + // adding styles, and throttling/debouncing function calls. + + // establish an extra stylesheet which addCssRule calls will use, + // plus an array to track actual indices in stylesheet for removal + var extraRules = [], + extraSheet, + removeMethod, + rulesProperty, + invalidCssChars = /([^A-Za-z0-9_\u00A0-\uFFFF-])/g; + + function removeRule(index){ + // Function called by the remove method on objects returned by addCssRule. + var realIndex = extraRules[index], + i, l; + if (realIndex === undefined) { return; } // already removed + + // remove rule indicated in internal array at index + extraSheet[removeMethod](realIndex); + + // Clear internal array item representing rule that was just deleted. + // NOTE: we do NOT splice, since the point of this array is specifically + // to negotiate the splicing that occurs in the stylesheet itself! + extraRules[index] = undefined; + + // Then update array items as necessary to downshift remaining rule indices. + // Can start at index + 1, since array is sparse but strictly increasing. + for(i = index + 1, l = extraRules.length; i < l; i++){ + if(extraRules[i] > realIndex){ extraRules[i]--; } + } + } + + var util = { + // Throttle/debounce functions + + defaultDelay: 15, + throttle: function(cb, context, delay){ + // summary: + // Returns a function which calls the given callback at most once per + // delay milliseconds. (Inspired by plugd) + var ran = false; + delay = delay || util.defaultDelay; + return function(){ + if(ran){ return; } + ran = true; + cb.apply(context, arguments); + setTimeout(function(){ ran = false; }, delay); + }; + }, + throttleDelayed: function(cb, context, delay){ + // summary: + // Like throttle, except that the callback runs after the delay, + // rather than before it. + var ran = false; + delay = delay || util.defaultDelay; + return function(){ + if(ran){ return; } + ran = true; + var a = arguments; + setTimeout(function(){ + ran = false; + cb.apply(context, a); + }, delay); + }; + }, + debounce: function(cb, context, delay){ + // summary: + // Returns a function which calls the given callback only after a + // certain time has passed without successive calls. (Inspired by plugd) + var timer; + delay = delay || util.defaultDelay; + return function(){ + if(timer){ + clearTimeout(timer); + timer = null; + } + var a = arguments; + timer = setTimeout(function(){ + cb.apply(context, a); + }, delay); + }; + }, + + // Iterative functions + + each: function(arrayOrObject, callback, context){ + // summary: + // Given an array or object, iterates through its keys. + // Does not use hasOwnProperty (since even Dojo does not + // consistently use it), but will iterate using a for or for-in + // loop as appropriate. + + var i, len; + + if(!arrayOrObject){ + return; + } + + if(typeof arrayOrObject.length === "number"){ + for(i = 0, len = arrayOrObject.length; i < len; i++){ + callback.call(context, arrayOrObject[i], i, arrayOrObject); + } + }else{ + for(i in arrayOrObject){ + callback.call(context, arrayOrObject[i], i, arrayOrObject); + } + } + }, + + // CSS-related functions + + addCssRule: function(selector, css){ + // summary: + // Dynamically adds a style rule to the document. Returns an object + // with a remove method which can be called to later remove the rule. + + if(!extraSheet){ + // First time, create an extra stylesheet for adding rules + extraSheet = put(document.getElementsByTagName("head")[0], "style"); + // Keep reference to actual StyleSheet object (`styleSheet` for IE < 9) + extraSheet = extraSheet.sheet || extraSheet.styleSheet; + // Store name of method used to remove rules (`removeRule` for IE < 9) + removeMethod = extraSheet.deleteRule ? "deleteRule" : "removeRule"; + // Store name of property used to access rules (`rules` for IE < 9) + rulesProperty = extraSheet.cssRules ? "cssRules" : "rules"; + } + + var index = extraRules.length; + extraRules[index] = (extraSheet.cssRules || extraSheet.rules).length; + extraSheet.addRule ? + extraSheet.addRule(selector, css) : + extraSheet.insertRule(selector + '{' + css + '}', extraRules[index]); + + return { + get: function(prop) { + return extraSheet[rulesProperty][extraRules[index]].style[prop]; + }, + set: function(prop, value) { + if (typeof extraRules[index] !== "undefined") { + extraSheet[rulesProperty][extraRules[index]].style[prop] = value; + } + }, + remove: function(){ + removeRule(index); + } + }; + }, + + escapeCssIdentifier: function(id){ + // summary: + // Escapes normally-invalid characters in a CSS identifier (such as .); + // see http://www.w3.org/TR/CSS2/syndata.html#value-def-identifier + // id: String + // CSS identifier (e.g. tag name, class, or id) to be escaped + + return id.replace(invalidCssChars, "\\$1"); + } + }; + return util; }); }, 'dojo/errors/CancelError':function(){ diff --git a/Core/dojo-build/dist/dgrid/extensions/nls/fr/pagination.js.uncompressed.js b/Core/dojo-build/dist/dgrid/extensions/nls/fr/pagination.js.uncompressed.js index d04d49b556..61ace2c10e 100644 --- a/Core/dojo-build/dist/dgrid/extensions/nls/fr/pagination.js.uncompressed.js +++ b/Core/dojo-build/dist/dgrid/extensions/nls/fr/pagination.js.uncompressed.js @@ -1,9 +1,9 @@ -define("dgrid/extensions/nls/fr/pagination", { - status: "${start} - ${end} de ${total} résultats", - gotoFirst: "Aller à la première page", - gotoNext: "Aller à la page suivante", - gotoPrev: "Aller à la page précédente", - gotoLast: "Aller à la dernière page", - gotoPage: "Aller à la page", - jumpPage: "Aller à la page" +define("dgrid/extensions/nls/fr/pagination", { + status: "${start} - ${end} de ${total} résultats", + gotoFirst: "Aller à la première page", + gotoNext: "Aller à la page suivante", + gotoPrev: "Aller à la page précédente", + gotoLast: "Aller à la dernière page", + gotoPage: "Aller à la page", + jumpPage: "Aller à la page" }); \ No newline at end of file diff --git a/Core/dojo-build/dist/dgrid/extensions/nls/sk/pagination.js.uncompressed.js b/Core/dojo-build/dist/dgrid/extensions/nls/sk/pagination.js.uncompressed.js index 51eedc7c28..52f0673818 100644 --- a/Core/dojo-build/dist/dgrid/extensions/nls/sk/pagination.js.uncompressed.js +++ b/Core/dojo-build/dist/dgrid/extensions/nls/sk/pagination.js.uncompressed.js @@ -1,9 +1,9 @@ -define("dgrid/extensions/nls/sk/pagination", { - status: "${start} - ${end} z ${total} výsledkov", - gotoFirst: "Prvá stránka", - gotoNext: "Nasledovná stránka", - gotoPrev: "Predchádzajúca stránka", - gotoLast: "Posledná stránka", - gotoPage: "Na stránku", - jumpPage: "Na stránku" -}); +define("dgrid/extensions/nls/sk/pagination", { + status: "${start} - ${end} z ${total} výsledkov", + gotoFirst: "Prvá stránka", + gotoNext: "Nasledovná stránka", + gotoPrev: "Predchádzajúca stránka", + gotoLast: "Posledná stránka", + gotoPage: "Na stránku", + jumpPage: "Na stránku" +}); diff --git a/Core/dojo-build/dist/dgrid/util/misc.js.uncompressed.js b/Core/dojo-build/dist/dgrid/util/misc.js.uncompressed.js index 7b3bc6b701..93d270dcfd 100644 --- a/Core/dojo-build/dist/dgrid/util/misc.js.uncompressed.js +++ b/Core/dojo-build/dist/dgrid/util/misc.js.uncompressed.js @@ -1,162 +1,162 @@ -define("dgrid/util/misc", ["put-selector/put"], function(put){ - // summary: - // This module defines miscellaneous utility methods for purposes of - // adding styles, and throttling/debouncing function calls. - - // establish an extra stylesheet which addCssRule calls will use, - // plus an array to track actual indices in stylesheet for removal - var extraRules = [], - extraSheet, - removeMethod, - rulesProperty, - invalidCssChars = /([^A-Za-z0-9_\u00A0-\uFFFF-])/g; - - function removeRule(index){ - // Function called by the remove method on objects returned by addCssRule. - var realIndex = extraRules[index], - i, l; - if (realIndex === undefined) { return; } // already removed - - // remove rule indicated in internal array at index - extraSheet[removeMethod](realIndex); - - // Clear internal array item representing rule that was just deleted. - // NOTE: we do NOT splice, since the point of this array is specifically - // to negotiate the splicing that occurs in the stylesheet itself! - extraRules[index] = undefined; - - // Then update array items as necessary to downshift remaining rule indices. - // Can start at index + 1, since array is sparse but strictly increasing. - for(i = index + 1, l = extraRules.length; i < l; i++){ - if(extraRules[i] > realIndex){ extraRules[i]--; } - } - } - - var util = { - // Throttle/debounce functions - - defaultDelay: 15, - throttle: function(cb, context, delay){ - // summary: - // Returns a function which calls the given callback at most once per - // delay milliseconds. (Inspired by plugd) - var ran = false; - delay = delay || util.defaultDelay; - return function(){ - if(ran){ return; } - ran = true; - cb.apply(context, arguments); - setTimeout(function(){ ran = false; }, delay); - }; - }, - throttleDelayed: function(cb, context, delay){ - // summary: - // Like throttle, except that the callback runs after the delay, - // rather than before it. - var ran = false; - delay = delay || util.defaultDelay; - return function(){ - if(ran){ return; } - ran = true; - var a = arguments; - setTimeout(function(){ - ran = false; - cb.apply(context, a); - }, delay); - }; - }, - debounce: function(cb, context, delay){ - // summary: - // Returns a function which calls the given callback only after a - // certain time has passed without successive calls. (Inspired by plugd) - var timer; - delay = delay || util.defaultDelay; - return function(){ - if(timer){ - clearTimeout(timer); - timer = null; - } - var a = arguments; - timer = setTimeout(function(){ - cb.apply(context, a); - }, delay); - }; - }, - - // Iterative functions - - each: function(arrayOrObject, callback, context){ - // summary: - // Given an array or object, iterates through its keys. - // Does not use hasOwnProperty (since even Dojo does not - // consistently use it), but will iterate using a for or for-in - // loop as appropriate. - - var i, len; - - if(!arrayOrObject){ - return; - } - - if(typeof arrayOrObject.length === "number"){ - for(i = 0, len = arrayOrObject.length; i < len; i++){ - callback.call(context, arrayOrObject[i], i, arrayOrObject); - } - }else{ - for(i in arrayOrObject){ - callback.call(context, arrayOrObject[i], i, arrayOrObject); - } - } - }, - - // CSS-related functions - - addCssRule: function(selector, css){ - // summary: - // Dynamically adds a style rule to the document. Returns an object - // with a remove method which can be called to later remove the rule. - - if(!extraSheet){ - // First time, create an extra stylesheet for adding rules - extraSheet = put(document.getElementsByTagName("head")[0], "style"); - // Keep reference to actual StyleSheet object (`styleSheet` for IE < 9) - extraSheet = extraSheet.sheet || extraSheet.styleSheet; - // Store name of method used to remove rules (`removeRule` for IE < 9) - removeMethod = extraSheet.deleteRule ? "deleteRule" : "removeRule"; - // Store name of property used to access rules (`rules` for IE < 9) - rulesProperty = extraSheet.cssRules ? "cssRules" : "rules"; - } - - var index = extraRules.length; - extraRules[index] = (extraSheet.cssRules || extraSheet.rules).length; - extraSheet.addRule ? - extraSheet.addRule(selector, css) : - extraSheet.insertRule(selector + '{' + css + '}', extraRules[index]); - - return { - get: function(prop) { - return extraSheet[rulesProperty][extraRules[index]].style[prop]; - }, - set: function(prop, value) { - if (typeof extraRules[index] !== "undefined") { - extraSheet[rulesProperty][extraRules[index]].style[prop] = value; - } - }, - remove: function(){ - removeRule(index); - } - }; - }, - - escapeCssIdentifier: function(id){ - // summary: - // Escapes normally-invalid characters in a CSS identifier (such as .); - // see http://www.w3.org/TR/CSS2/syndata.html#value-def-identifier - // id: String - // CSS identifier (e.g. tag name, class, or id) to be escaped - - return id.replace(invalidCssChars, "\\$1"); - } - }; - return util; +define("dgrid/util/misc", ["put-selector/put"], function(put){ + // summary: + // This module defines miscellaneous utility methods for purposes of + // adding styles, and throttling/debouncing function calls. + + // establish an extra stylesheet which addCssRule calls will use, + // plus an array to track actual indices in stylesheet for removal + var extraRules = [], + extraSheet, + removeMethod, + rulesProperty, + invalidCssChars = /([^A-Za-z0-9_\u00A0-\uFFFF-])/g; + + function removeRule(index){ + // Function called by the remove method on objects returned by addCssRule. + var realIndex = extraRules[index], + i, l; + if (realIndex === undefined) { return; } // already removed + + // remove rule indicated in internal array at index + extraSheet[removeMethod](realIndex); + + // Clear internal array item representing rule that was just deleted. + // NOTE: we do NOT splice, since the point of this array is specifically + // to negotiate the splicing that occurs in the stylesheet itself! + extraRules[index] = undefined; + + // Then update array items as necessary to downshift remaining rule indices. + // Can start at index + 1, since array is sparse but strictly increasing. + for(i = index + 1, l = extraRules.length; i < l; i++){ + if(extraRules[i] > realIndex){ extraRules[i]--; } + } + } + + var util = { + // Throttle/debounce functions + + defaultDelay: 15, + throttle: function(cb, context, delay){ + // summary: + // Returns a function which calls the given callback at most once per + // delay milliseconds. (Inspired by plugd) + var ran = false; + delay = delay || util.defaultDelay; + return function(){ + if(ran){ return; } + ran = true; + cb.apply(context, arguments); + setTimeout(function(){ ran = false; }, delay); + }; + }, + throttleDelayed: function(cb, context, delay){ + // summary: + // Like throttle, except that the callback runs after the delay, + // rather than before it. + var ran = false; + delay = delay || util.defaultDelay; + return function(){ + if(ran){ return; } + ran = true; + var a = arguments; + setTimeout(function(){ + ran = false; + cb.apply(context, a); + }, delay); + }; + }, + debounce: function(cb, context, delay){ + // summary: + // Returns a function which calls the given callback only after a + // certain time has passed without successive calls. (Inspired by plugd) + var timer; + delay = delay || util.defaultDelay; + return function(){ + if(timer){ + clearTimeout(timer); + timer = null; + } + var a = arguments; + timer = setTimeout(function(){ + cb.apply(context, a); + }, delay); + }; + }, + + // Iterative functions + + each: function(arrayOrObject, callback, context){ + // summary: + // Given an array or object, iterates through its keys. + // Does not use hasOwnProperty (since even Dojo does not + // consistently use it), but will iterate using a for or for-in + // loop as appropriate. + + var i, len; + + if(!arrayOrObject){ + return; + } + + if(typeof arrayOrObject.length === "number"){ + for(i = 0, len = arrayOrObject.length; i < len; i++){ + callback.call(context, arrayOrObject[i], i, arrayOrObject); + } + }else{ + for(i in arrayOrObject){ + callback.call(context, arrayOrObject[i], i, arrayOrObject); + } + } + }, + + // CSS-related functions + + addCssRule: function(selector, css){ + // summary: + // Dynamically adds a style rule to the document. Returns an object + // with a remove method which can be called to later remove the rule. + + if(!extraSheet){ + // First time, create an extra stylesheet for adding rules + extraSheet = put(document.getElementsByTagName("head")[0], "style"); + // Keep reference to actual StyleSheet object (`styleSheet` for IE < 9) + extraSheet = extraSheet.sheet || extraSheet.styleSheet; + // Store name of method used to remove rules (`removeRule` for IE < 9) + removeMethod = extraSheet.deleteRule ? "deleteRule" : "removeRule"; + // Store name of property used to access rules (`rules` for IE < 9) + rulesProperty = extraSheet.cssRules ? "cssRules" : "rules"; + } + + var index = extraRules.length; + extraRules[index] = (extraSheet.cssRules || extraSheet.rules).length; + extraSheet.addRule ? + extraSheet.addRule(selector, css) : + extraSheet.insertRule(selector + '{' + css + '}', extraRules[index]); + + return { + get: function(prop) { + return extraSheet[rulesProperty][extraRules[index]].style[prop]; + }, + set: function(prop, value) { + if (typeof extraRules[index] !== "undefined") { + extraSheet[rulesProperty][extraRules[index]].style[prop] = value; + } + }, + remove: function(){ + removeRule(index); + } + }; + }, + + escapeCssIdentifier: function(id){ + // summary: + // Escapes normally-invalid characters in a CSS identifier (such as .); + // see http://www.w3.org/TR/CSS2/syndata.html#value-def-identifier + // id: String + // CSS identifier (e.g. tag name, class, or id) to be escaped + + return id.replace(invalidCssChars, "\\$1"); + } + }; + return util; }); \ No newline at end of file diff --git a/Core/dojo-build/dist/dgrid/util/touch.js.uncompressed.js b/Core/dojo-build/dist/dgrid/util/touch.js.uncompressed.js index ba3640bf9d..61d724dd80 100644 --- a/Core/dojo-build/dist/dgrid/util/touch.js.uncompressed.js +++ b/Core/dojo-build/dist/dgrid/util/touch.js.uncompressed.js @@ -1,123 +1,123 @@ -define("dgrid/util/touch", ["dojo/on", "dojo/query"], -function(on, query){ - // This module exposes useful functions for working with touch devices. - - var util = { - // Overridable defaults related to extension events defined below. - tapRadius: 10, - dbltapTime: 250, - - selector: function(selector, eventType, children){ - // summary: - // Reimplementation of on.selector, taking an iOS quirk into account - return function(target, listener){ - var bubble = eventType.bubble; - if(bubble){ - // the event type doesn't naturally bubble, but has a bubbling form, use that - eventType = bubble; - }else if(children !== false){ - // for normal bubbling events we default to allowing children of the selector - children = true; - } - return on(target, eventType, function(event){ - var eventTarget = event.target; - - // iOS tends to report the text node an event was fired on, rather than - // the top-level element; this may end up causing errors in selector engines - if(eventTarget.nodeType == 3){ eventTarget = eventTarget.parentNode; } - - // there is a selector, so make sure it matches - while(!query.matches(eventTarget, selector, target)){ - if(eventTarget == target || !children || !(eventTarget = eventTarget.parentNode)){ // intentional assignment - return; - } - } - return listener.call(eventTarget, event); - }); - }; - }, - - countCurrentTouches: function(evt, node){ - // summary: - // Given a touch event and a DOM node, counts how many current touches - // presently lie within that node. Useful in cases where an accurate - // count is needed but tracking changedTouches won't suffice because - // other handlers stop events from bubbling high enough. - - var i, numTouches, touch; - for(i = 0, numTouches = 0; (touch = evt.touches[i]); ++i){ - if(node.contains(touch.target)){ - ++numTouches; - } - } - return numTouches; - } - }; - - function handleTapStart(target, listener, evt, prevent){ - // Common function for handling tap detection. - // The passed listener will only be fired when and if a touchend is fired - // which confirms the overall gesture resembled a tap. - - if(evt.targetTouches.length > 1){ return; } // ignore multitouch - - var start = evt.changedTouches[0], - startX = start.screenX, - startY = start.screenY; - - prevent && evt.preventDefault(); - - var endListener = on(target, "touchend", function(evt){ - var end = evt.changedTouches[0]; - if(!evt.targetTouches.length){ - // only call listener if this really seems like a tap - if(Math.abs(end.screenX - startX) < util.tapRadius && - Math.abs(end.screenY - startY) < util.tapRadius){ - prevent && evt.preventDefault(); - listener.call(this, evt); - } - endListener.remove(); - } - }); - } - - function tap(target, listener){ - // Function usable by dojo/on as a synthetic tap event. - return on(target, "touchstart", function(evt){ - handleTapStart(target, listener, evt); - }); - } - - function dbltap(target, listener){ - // Function usable by dojo/on as a synthetic double-tap event. - var first, timeout; - - return on(target, "touchstart", function(evt){ - if(!first){ - // first potential tap: detect as usual, but with specific logic - handleTapStart(target, function(evt){ - first = evt.changedTouches[0]; - timeout = setTimeout(function(){ first = timeout = null; }, util.dbltapTime); - }, evt); - }else{ - handleTapStart(target, function(evt){ - // bail out if first was cleared between 2nd touchstart and touchend - if(!first){ return; } - var second = evt.changedTouches[0]; - // only call listener if both taps occurred near the same place - if(Math.abs(second.screenX - first.screenX) < util.tapRadius && - Math.abs(second.screenY - first.screenY) < util.tapRadius){ - timeout && clearTimeout(timeout); - first = timeout = null; - listener.call(this, evt); - } - }, evt, true); - } - }); - } - - util.tap = tap; - util.dbltap = dbltap; - - return util; +define("dgrid/util/touch", ["dojo/on", "dojo/query"], +function(on, query){ + // This module exposes useful functions for working with touch devices. + + var util = { + // Overridable defaults related to extension events defined below. + tapRadius: 10, + dbltapTime: 250, + + selector: function(selector, eventType, children){ + // summary: + // Reimplementation of on.selector, taking an iOS quirk into account + return function(target, listener){ + var bubble = eventType.bubble; + if(bubble){ + // the event type doesn't naturally bubble, but has a bubbling form, use that + eventType = bubble; + }else if(children !== false){ + // for normal bubbling events we default to allowing children of the selector + children = true; + } + return on(target, eventType, function(event){ + var eventTarget = event.target; + + // iOS tends to report the text node an event was fired on, rather than + // the top-level element; this may end up causing errors in selector engines + if(eventTarget.nodeType == 3){ eventTarget = eventTarget.parentNode; } + + // there is a selector, so make sure it matches + while(!query.matches(eventTarget, selector, target)){ + if(eventTarget == target || !children || !(eventTarget = eventTarget.parentNode)){ // intentional assignment + return; + } + } + return listener.call(eventTarget, event); + }); + }; + }, + + countCurrentTouches: function(evt, node){ + // summary: + // Given a touch event and a DOM node, counts how many current touches + // presently lie within that node. Useful in cases where an accurate + // count is needed but tracking changedTouches won't suffice because + // other handlers stop events from bubbling high enough. + + var i, numTouches, touch; + for(i = 0, numTouches = 0; (touch = evt.touches[i]); ++i){ + if(node.contains(touch.target)){ + ++numTouches; + } + } + return numTouches; + } + }; + + function handleTapStart(target, listener, evt, prevent){ + // Common function for handling tap detection. + // The passed listener will only be fired when and if a touchend is fired + // which confirms the overall gesture resembled a tap. + + if(evt.targetTouches.length > 1){ return; } // ignore multitouch + + var start = evt.changedTouches[0], + startX = start.screenX, + startY = start.screenY; + + prevent && evt.preventDefault(); + + var endListener = on(target, "touchend", function(evt){ + var end = evt.changedTouches[0]; + if(!evt.targetTouches.length){ + // only call listener if this really seems like a tap + if(Math.abs(end.screenX - startX) < util.tapRadius && + Math.abs(end.screenY - startY) < util.tapRadius){ + prevent && evt.preventDefault(); + listener.call(this, evt); + } + endListener.remove(); + } + }); + } + + function tap(target, listener){ + // Function usable by dojo/on as a synthetic tap event. + return on(target, "touchstart", function(evt){ + handleTapStart(target, listener, evt); + }); + } + + function dbltap(target, listener){ + // Function usable by dojo/on as a synthetic double-tap event. + var first, timeout; + + return on(target, "touchstart", function(evt){ + if(!first){ + // first potential tap: detect as usual, but with specific logic + handleTapStart(target, function(evt){ + first = evt.changedTouches[0]; + timeout = setTimeout(function(){ first = timeout = null; }, util.dbltapTime); + }, evt); + }else{ + handleTapStart(target, function(evt){ + // bail out if first was cleared between 2nd touchstart and touchend + if(!first){ return; } + var second = evt.changedTouches[0]; + // only call listener if both taps occurred near the same place + if(Math.abs(second.screenX - first.screenX) < util.tapRadius && + Math.abs(second.screenY - first.screenY) < util.tapRadius){ + timeout && clearTimeout(timeout); + first = timeout = null; + listener.call(this, evt); + } + }, evt, true); + } + }); + } + + util.tap = tap; + util.dbltap = dbltap; + + return util; }); \ No newline at end of file diff --git a/Core/dojo-build/dist/dijit/form/_TextBoxMixin.js.uncompressed.js b/Core/dojo-build/dist/dijit/form/_TextBoxMixin.js.uncompressed.js index d87984043c..a1f527f5af 100644 --- a/Core/dojo-build/dist/dijit/form/_TextBoxMixin.js.uncompressed.js +++ b/Core/dojo-build/dist/dijit/form/_TextBoxMixin.js.uncompressed.js @@ -1,499 +1,499 @@ -define("dijit/form/_TextBoxMixin", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom", // dom.byId - "dojo/has", - "dojo/keys", // keys.ALT keys.CAPS_LOCK keys.CTRL keys.META keys.SHIFT - "dojo/_base/lang", // lang.mixin - "dojo/on", // on - "../main" // for exporting dijit._setSelectionRange, dijit.selectInputText -], function(array, declare, dom, has, keys, lang, on, dijit){ - - // module: - // dijit/form/_TextBoxMixin - - var _TextBoxMixin = declare("dijit.form._TextBoxMixin" + (has("dojo-bidi") ? "_NoBidi" : ""), null, { - // summary: - // A mixin for textbox form input widgets - - // trim: Boolean - // Removes leading and trailing whitespace if true. Default is false. - trim: false, - - // uppercase: Boolean - // Converts all characters to uppercase if true. Default is false. - uppercase: false, - - // lowercase: Boolean - // Converts all characters to lowercase if true. Default is false. - lowercase: false, - - // propercase: Boolean - // Converts the first character of each word to uppercase if true. - propercase: false, - - // maxLength: String - // HTML INPUT tag maxLength declaration. - maxLength: "", - - // selectOnClick: [const] Boolean - // If true, all text will be selected when focused with mouse - selectOnClick: false, - - // placeHolder: String - // Defines a hint to help users fill out the input field (as defined in HTML 5). - // This should only contain plain text (no html markup). - placeHolder: "", - - _getValueAttr: function(){ - // summary: - // Hook so get('value') works as we like. - // description: - // For `dijit/form/TextBox` this basically returns the value of the ``. - // - // For `dijit/form/MappedTextBox` subclasses, which have both - // a "displayed value" and a separate "submit value", - // This treats the "displayed value" as the master value, computing the - // submit value from it via this.parse(). - return this.parse(this.get('displayedValue'), this.constraints); - }, - - _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - // summary: - // Hook so set('value', ...) works. - // - // description: - // Sets the value of the widget to "value" which can be of - // any type as determined by the widget. - // - // value: - // The visual element value is also set to a corresponding, - // but not necessarily the same, value. - // - // formattedValue: - // If specified, used to set the visual element value, - // otherwise a computed visual value is used. - // - // priorityChange: - // If true, an onChange event is fired immediately instead of - // waiting for the next blur event. - - var filteredValue; - if(value !== undefined){ - // TODO: this is calling filter() on both the display value and the actual value. - // I added a comment to the filter() definition about this, but it should be changed. - filteredValue = this.filter(value); - if(typeof formattedValue != "string"){ - if(filteredValue !== null && ((typeof filteredValue != "number") || !isNaN(filteredValue))){ - formattedValue = this.filter(this.format(filteredValue, this.constraints)); - }else{ - formattedValue = ''; - } - } - } - if(formattedValue != null /* and !undefined */ && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ - this.textbox.value = formattedValue; - this._set("displayedValue", this.get("displayedValue")); - } - - this.inherited(arguments, [filteredValue, priorityChange]); - }, - - // displayedValue: String - // For subclasses like ComboBox where the displayed value - // (ex: Kentucky) and the serialized value (ex: KY) are different, - // this represents the displayed value. - // - // Setting 'displayedValue' through set('displayedValue', ...) - // updates 'value', and vice-versa. Otherwise 'value' is updated - // from 'displayedValue' periodically, like onBlur etc. - // - // TODO: move declaration to MappedTextBox? - // Problem is that ComboBox references displayedValue, - // for benefit of FilteringSelect. - displayedValue: "", - - _getDisplayedValueAttr: function(){ - // summary: - // Hook so get('displayedValue') works. - // description: - // Returns the displayed value (what the user sees on the screen), - // after filtering (ie, trimming spaces etc.). - // - // For some subclasses of TextBox (like ComboBox), the displayed value - // is different from the serialized value that's actually - // sent to the server (see `dijit/form/ValidationTextBox.serialize()`) - - // TODO: maybe we should update this.displayedValue on every keystroke so that we don't need - // this method - // TODO: this isn't really the displayed value when the user is typing - return this.filter(this.textbox.value); - }, - - _setDisplayedValueAttr: function(/*String*/ value){ - // summary: - // Hook so set('displayedValue', ...) works. - // description: - // Sets the value of the visual element to the string "value". - // The widget value is also set to a corresponding, - // but not necessarily the same, value. - - if(value == null /* or undefined */){ - value = '' - } - else if(typeof value != "string"){ - value = String(value) - } - - this.textbox.value = value; - - // sets the serialized value to something corresponding to specified displayedValue - // (if possible), and also updates the textbox.value, for example converting "123" - // to "123.00" - this._setValueAttr(this.get('value'), undefined); - - this._set("displayedValue", this.get('displayedValue')); - }, - - format: function(value /*=====, constraints =====*/){ - // summary: - // Replaceable function to convert a value to a properly formatted string. - // value: String - // constraints: Object - // tags: - // protected extension - return value == null /* or undefined */ ? "" : (value.toString ? value.toString() : value); - }, - - parse: function(value /*=====, constraints =====*/){ - // summary: - // Replaceable function to convert a formatted string to a value - // value: String - // constraints: Object - // tags: - // protected extension - - return value; // String - }, - - _refreshState: function(){ - // summary: - // After the user types some characters, etc., this method is - // called to check the field for validity etc. The base method - // in `dijit/form/TextBox` does nothing, but subclasses override. - // tags: - // protected - }, - - onInput: function(/*===== event =====*/){ - // summary: - // Connect to this function to receive notifications of various user data-input events. - // Return false to cancel the event and prevent it from being processed. - // event: - // keydown | keypress | cut | paste | input - // tags: - // callback - }, - - __skipInputEvent: false, - _onInput: function(/*Event*/ evt){ - // summary: - // Called AFTER the input event has happened - - this._processInput(evt); - - if(this.intermediateChanges){ - // allow the key to post to the widget input box - this.defer(function(){ - this._handleOnChange(this.get('value'), false); - }); - } - }, - - _processInput: function(/*Event*/ evt){ - // summary: - // Default action handler for user input events - - this._refreshState(); - - // In case someone is watch()'ing for changes to displayedValue - this._set("displayedValue", this.get("displayedValue")); - }, - - postCreate: function(){ - // setting the value here is needed since value="" in the template causes "undefined" - // and setting in the DOM (instead of the JS object) helps with form reset actions - this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values should be the same - - this.inherited(arguments); - - // normalize input events to reduce spurious event processing - // onkeydown: do not forward modifier keys - // set charOrCode to numeric keycode - // onkeypress: do not forward numeric charOrCode keys (already sent through onkeydown) - // onpaste & oncut: set charOrCode to 229 (IME) - // oninput: if primary event not already processed, set charOrCode to 229 (IME), else do not forward - var handleEvent = function(e){ - var charOrCode; - if(e.type == "keydown"){ - charOrCode = e.keyCode; - switch(charOrCode){ // ignore state keys - case keys.SHIFT: - case keys.ALT: - case keys.CTRL: - case keys.META: - case keys.CAPS_LOCK: - case keys.NUM_LOCK: - case keys.SCROLL_LOCK: - return; - } - if(!e.ctrlKey && !e.metaKey && !e.altKey){ // no modifiers - switch(charOrCode){ // ignore location keys - case keys.NUMPAD_0: - case keys.NUMPAD_1: - case keys.NUMPAD_2: - case keys.NUMPAD_3: - case keys.NUMPAD_4: - case keys.NUMPAD_5: - case keys.NUMPAD_6: - case keys.NUMPAD_7: - case keys.NUMPAD_8: - case keys.NUMPAD_9: - case keys.NUMPAD_MULTIPLY: - case keys.NUMPAD_PLUS: - case keys.NUMPAD_ENTER: - case keys.NUMPAD_MINUS: - case keys.NUMPAD_PERIOD: - case keys.NUMPAD_DIVIDE: - return; - } - if((charOrCode >= 65 && charOrCode <= 90) || (charOrCode >= 48 && charOrCode <= 57) || charOrCode == keys.SPACE){ - return; // keypress will handle simple non-modified printable keys - } - var named = false; - for(var i in keys){ - if(keys[i] === e.keyCode){ - named = true; - break; - } - } - if(!named){ - return; - } // only allow named ones through - } - } - charOrCode = e.charCode >= 32 ? String.fromCharCode(e.charCode) : e.charCode; - if(!charOrCode){ - charOrCode = (e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == keys.SPACE ? String.fromCharCode(e.keyCode) : e.keyCode; - } - if(!charOrCode){ - charOrCode = 229; // IME - } - if(e.type == "keypress"){ - if(typeof charOrCode != "string"){ - return; - } - if((charOrCode >= 'a' && charOrCode <= 'z') || (charOrCode >= 'A' && charOrCode <= 'Z') || (charOrCode >= '0' && charOrCode <= '9') || (charOrCode === ' ')){ - if(e.ctrlKey || e.metaKey || e.altKey){ - return; - } // can only be stopped reliably in keydown - } - } - if(e.type == "input"){ - if(this.__skipInputEvent){ // duplicate event - this.__skipInputEvent = false; - return; - } - }else{ - this.__skipInputEvent = true; - } - // create fake event to set charOrCode and to know if preventDefault() was called - var faux = { faux: true }, attr; - for(attr in e){ - if(attr != "layerX" && attr != "layerY"){ // prevent WebKit warnings - var v = e[attr]; - if(typeof v != "function" && typeof v != "undefined"){ - faux[attr] = v; - } - } - } - lang.mixin(faux, { - charOrCode: charOrCode, - _wasConsumed: false, - preventDefault: function(){ - faux._wasConsumed = true; - e.preventDefault(); - }, - stopPropagation: function(){ - e.stopPropagation(); - } - }); - // give web page author a chance to consume the event - //console.log(faux.type + ', charOrCode = (' + (typeof charOrCode) + ') ' + charOrCode + ', ctrl ' + !!faux.ctrlKey + ', alt ' + !!faux.altKey + ', meta ' + !!faux.metaKey + ', shift ' + !!faux.shiftKey); - if(this.onInput(faux) === false){ // return false means stop - faux.preventDefault(); - faux.stopPropagation(); - } - if(faux._wasConsumed){ - return; - } // if preventDefault was called - this.defer(function(){ - this._onInput(faux); - }); // widget notification after key has posted - if(e.type == "keypress"){ - e.stopPropagation(); // don't allow parents to stop printables from being typed - } - }; - this.own(on(this.textbox, "keydown, keypress, paste, cut, input, compositionend", lang.hitch(this, handleEvent))); - }, - - _blankValue: '', // if the textbox is blank, what value should be reported - filter: function(val){ - // summary: - // Auto-corrections (such as trimming) that are applied to textbox - // value on blur or form submit. - // description: - // For MappedTextBox subclasses, this is called twice - // - // - once with the display value - // - once the value as set/returned by set('value', ...) - // - // and get('value'), ex: a Number for NumberTextBox. - // - // In the latter case it does corrections like converting null to NaN. In - // the former case the NumberTextBox.filter() method calls this.inherited() - // to execute standard trimming code in TextBox.filter(). - // - // TODO: break this into two methods in 2.0 - // - // tags: - // protected extension - if(val === null){ - return this._blankValue; - } - if(typeof val != "string"){ - return val; - } - if(this.trim){ - val = lang.trim(val); - } - if(this.uppercase){ - val = val.toUpperCase(); - } - if(this.lowercase){ - val = val.toLowerCase(); - } - if(this.propercase){ - val = val.replace(/[^\s]+/g, function(word){ - return word.substring(0, 1).toUpperCase() + word.substring(1); - }); - } - return val; - }, - - _setBlurValue: function(){ - // Format the displayed value, for example (for NumberTextBox) convert 1.4 to 1.400, - // or (for CurrencyTextBox) 2.50 to $2.50 - - this._setValueAttr(this.get('value'), true); - }, - - _onBlur: function(e){ - if(this.disabled){ - return; - } - this._setBlurValue(); - this.inherited(arguments); - }, - - _isTextSelected: function(){ - return this.textbox.selectionStart != this.textbox.selectionEnd; - }, - - _onFocus: function(/*String*/ by){ - if(this.disabled || this.readOnly){ - return; - } - - // Select all text on focus via click if nothing already selected. - // Since mouse-up will clear the selection, need to defer selection until after mouse-up. - // Don't do anything on focus by tabbing into the widget since there's no associated mouse-up event. - if(this.selectOnClick && by == "mouse"){ - // Use on.once() to only select all text on first click only; otherwise users would have no way to clear - // the selection. - this._selectOnClickHandle = on.once(this.domNode, "mouseup, touchend", lang.hitch(this, function(evt){ - // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up) - // and if not, then select all the text - if(!this._isTextSelected()){ - _TextBoxMixin.selectInputText(this.textbox); - } - })); - this.own(this._selectOnClickHandle); - - // in case the mouseup never comes - this.defer(function(){ - if(this._selectOnClickHandle){ - this._selectOnClickHandle.remove(); - this._selectOnClickHandle = null; - } - }, 500); // if mouseup not received soon, then treat it as some gesture - } - // call this.inherited() before refreshState(), since this.inherited() will possibly scroll the viewport - // (to scroll the TextBox into view), which will affect how _refreshState() positions the tooltip - this.inherited(arguments); - - this._refreshState(); - }, - - reset: function(){ - // Overrides `dijit/_FormWidget/reset()`. - // Additionally resets the displayed textbox value to '' - this.textbox.value = ''; - this.inherited(arguments); - } - }); - - if(has("dojo-bidi")){ - _TextBoxMixin = declare("dijit.form._TextBoxMixin", _TextBoxMixin, { - _setValueAttr: function(){ - this.inherited(arguments); - this.applyTextDir(this.focusNode); - }, - _setDisplayedValueAttr: function(){ - this.inherited(arguments); - this.applyTextDir(this.focusNode); - }, - _onInput: function(){ - this.applyTextDir(this.focusNode); - this.inherited(arguments); - } - }); - } - - _TextBoxMixin._setSelectionRange = dijit._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ - if(element.setSelectionRange){ - element.setSelectionRange(start, stop); - } - }; - - _TextBoxMixin.selectInputText = dijit.selectInputText = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ - // summary: - // Select text in the input element argument, from start (default 0), to stop (default end). - - // TODO: use functions in _editor/selection.js? - element = dom.byId(element); - if(isNaN(start)){ - start = 0; - } - if(isNaN(stop)){ - stop = element.value ? element.value.length : 0; - } - try{ - element.focus(); - _TextBoxMixin._setSelectionRange(element, start, stop); - }catch(e){ /* squelch random errors (esp. on IE) from unexpected focus changes or DOM nodes being hidden */ - } - }; - - return _TextBoxMixin; -}); +define("dijit/form/_TextBoxMixin", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dom", // dom.byId + "dojo/has", + "dojo/keys", // keys.ALT keys.CAPS_LOCK keys.CTRL keys.META keys.SHIFT + "dojo/_base/lang", // lang.mixin + "dojo/on", // on + "../main" // for exporting dijit._setSelectionRange, dijit.selectInputText +], function(array, declare, dom, has, keys, lang, on, dijit){ + + // module: + // dijit/form/_TextBoxMixin + + var _TextBoxMixin = declare("dijit.form._TextBoxMixin" + (has("dojo-bidi") ? "_NoBidi" : ""), null, { + // summary: + // A mixin for textbox form input widgets + + // trim: Boolean + // Removes leading and trailing whitespace if true. Default is false. + trim: false, + + // uppercase: Boolean + // Converts all characters to uppercase if true. Default is false. + uppercase: false, + + // lowercase: Boolean + // Converts all characters to lowercase if true. Default is false. + lowercase: false, + + // propercase: Boolean + // Converts the first character of each word to uppercase if true. + propercase: false, + + // maxLength: String + // HTML INPUT tag maxLength declaration. + maxLength: "", + + // selectOnClick: [const] Boolean + // If true, all text will be selected when focused with mouse + selectOnClick: false, + + // placeHolder: String + // Defines a hint to help users fill out the input field (as defined in HTML 5). + // This should only contain plain text (no html markup). + placeHolder: "", + + _getValueAttr: function(){ + // summary: + // Hook so get('value') works as we like. + // description: + // For `dijit/form/TextBox` this basically returns the value of the ``. + // + // For `dijit/form/MappedTextBox` subclasses, which have both + // a "displayed value" and a separate "submit value", + // This treats the "displayed value" as the master value, computing the + // submit value from it via this.parse(). + return this.parse(this.get('displayedValue'), this.constraints); + }, + + _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + // summary: + // Hook so set('value', ...) works. + // + // description: + // Sets the value of the widget to "value" which can be of + // any type as determined by the widget. + // + // value: + // The visual element value is also set to a corresponding, + // but not necessarily the same, value. + // + // formattedValue: + // If specified, used to set the visual element value, + // otherwise a computed visual value is used. + // + // priorityChange: + // If true, an onChange event is fired immediately instead of + // waiting for the next blur event. + + var filteredValue; + if(value !== undefined){ + // TODO: this is calling filter() on both the display value and the actual value. + // I added a comment to the filter() definition about this, but it should be changed. + filteredValue = this.filter(value); + if(typeof formattedValue != "string"){ + if(filteredValue !== null && ((typeof filteredValue != "number") || !isNaN(filteredValue))){ + formattedValue = this.filter(this.format(filteredValue, this.constraints)); + }else{ + formattedValue = ''; + } + } + } + if(formattedValue != null /* and !undefined */ && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ + this.textbox.value = formattedValue; + this._set("displayedValue", this.get("displayedValue")); + } + + this.inherited(arguments, [filteredValue, priorityChange]); + }, + + // displayedValue: String + // For subclasses like ComboBox where the displayed value + // (ex: Kentucky) and the serialized value (ex: KY) are different, + // this represents the displayed value. + // + // Setting 'displayedValue' through set('displayedValue', ...) + // updates 'value', and vice-versa. Otherwise 'value' is updated + // from 'displayedValue' periodically, like onBlur etc. + // + // TODO: move declaration to MappedTextBox? + // Problem is that ComboBox references displayedValue, + // for benefit of FilteringSelect. + displayedValue: "", + + _getDisplayedValueAttr: function(){ + // summary: + // Hook so get('displayedValue') works. + // description: + // Returns the displayed value (what the user sees on the screen), + // after filtering (ie, trimming spaces etc.). + // + // For some subclasses of TextBox (like ComboBox), the displayed value + // is different from the serialized value that's actually + // sent to the server (see `dijit/form/ValidationTextBox.serialize()`) + + // TODO: maybe we should update this.displayedValue on every keystroke so that we don't need + // this method + // TODO: this isn't really the displayed value when the user is typing + return this.filter(this.textbox.value); + }, + + _setDisplayedValueAttr: function(/*String*/ value){ + // summary: + // Hook so set('displayedValue', ...) works. + // description: + // Sets the value of the visual element to the string "value". + // The widget value is also set to a corresponding, + // but not necessarily the same, value. + + if(value == null /* or undefined */){ + value = '' + } + else if(typeof value != "string"){ + value = String(value) + } + + this.textbox.value = value; + + // sets the serialized value to something corresponding to specified displayedValue + // (if possible), and also updates the textbox.value, for example converting "123" + // to "123.00" + this._setValueAttr(this.get('value'), undefined); + + this._set("displayedValue", this.get('displayedValue')); + }, + + format: function(value /*=====, constraints =====*/){ + // summary: + // Replaceable function to convert a value to a properly formatted string. + // value: String + // constraints: Object + // tags: + // protected extension + return value == null /* or undefined */ ? "" : (value.toString ? value.toString() : value); + }, + + parse: function(value /*=====, constraints =====*/){ + // summary: + // Replaceable function to convert a formatted string to a value + // value: String + // constraints: Object + // tags: + // protected extension + + return value; // String + }, + + _refreshState: function(){ + // summary: + // After the user types some characters, etc., this method is + // called to check the field for validity etc. The base method + // in `dijit/form/TextBox` does nothing, but subclasses override. + // tags: + // protected + }, + + onInput: function(/*===== event =====*/){ + // summary: + // Connect to this function to receive notifications of various user data-input events. + // Return false to cancel the event and prevent it from being processed. + // event: + // keydown | keypress | cut | paste | input + // tags: + // callback + }, + + __skipInputEvent: false, + _onInput: function(/*Event*/ evt){ + // summary: + // Called AFTER the input event has happened + + this._processInput(evt); + + if(this.intermediateChanges){ + // allow the key to post to the widget input box + this.defer(function(){ + this._handleOnChange(this.get('value'), false); + }); + } + }, + + _processInput: function(/*Event*/ evt){ + // summary: + // Default action handler for user input events + + this._refreshState(); + + // In case someone is watch()'ing for changes to displayedValue + this._set("displayedValue", this.get("displayedValue")); + }, + + postCreate: function(){ + // setting the value here is needed since value="" in the template causes "undefined" + // and setting in the DOM (instead of the JS object) helps with form reset actions + this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values should be the same + + this.inherited(arguments); + + // normalize input events to reduce spurious event processing + // onkeydown: do not forward modifier keys + // set charOrCode to numeric keycode + // onkeypress: do not forward numeric charOrCode keys (already sent through onkeydown) + // onpaste & oncut: set charOrCode to 229 (IME) + // oninput: if primary event not already processed, set charOrCode to 229 (IME), else do not forward + var handleEvent = function(e){ + var charOrCode; + if(e.type == "keydown"){ + charOrCode = e.keyCode; + switch(charOrCode){ // ignore state keys + case keys.SHIFT: + case keys.ALT: + case keys.CTRL: + case keys.META: + case keys.CAPS_LOCK: + case keys.NUM_LOCK: + case keys.SCROLL_LOCK: + return; + } + if(!e.ctrlKey && !e.metaKey && !e.altKey){ // no modifiers + switch(charOrCode){ // ignore location keys + case keys.NUMPAD_0: + case keys.NUMPAD_1: + case keys.NUMPAD_2: + case keys.NUMPAD_3: + case keys.NUMPAD_4: + case keys.NUMPAD_5: + case keys.NUMPAD_6: + case keys.NUMPAD_7: + case keys.NUMPAD_8: + case keys.NUMPAD_9: + case keys.NUMPAD_MULTIPLY: + case keys.NUMPAD_PLUS: + case keys.NUMPAD_ENTER: + case keys.NUMPAD_MINUS: + case keys.NUMPAD_PERIOD: + case keys.NUMPAD_DIVIDE: + return; + } + if((charOrCode >= 65 && charOrCode <= 90) || (charOrCode >= 48 && charOrCode <= 57) || charOrCode == keys.SPACE){ + return; // keypress will handle simple non-modified printable keys + } + var named = false; + for(var i in keys){ + if(keys[i] === e.keyCode){ + named = true; + break; + } + } + if(!named){ + return; + } // only allow named ones through + } + } + charOrCode = e.charCode >= 32 ? String.fromCharCode(e.charCode) : e.charCode; + if(!charOrCode){ + charOrCode = (e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == keys.SPACE ? String.fromCharCode(e.keyCode) : e.keyCode; + } + if(!charOrCode){ + charOrCode = 229; // IME + } + if(e.type == "keypress"){ + if(typeof charOrCode != "string"){ + return; + } + if((charOrCode >= 'a' && charOrCode <= 'z') || (charOrCode >= 'A' && charOrCode <= 'Z') || (charOrCode >= '0' && charOrCode <= '9') || (charOrCode === ' ')){ + if(e.ctrlKey || e.metaKey || e.altKey){ + return; + } // can only be stopped reliably in keydown + } + } + if(e.type == "input"){ + if(this.__skipInputEvent){ // duplicate event + this.__skipInputEvent = false; + return; + } + }else{ + this.__skipInputEvent = true; + } + // create fake event to set charOrCode and to know if preventDefault() was called + var faux = { faux: true }, attr; + for(attr in e){ + if(attr != "layerX" && attr != "layerY"){ // prevent WebKit warnings + var v = e[attr]; + if(typeof v != "function" && typeof v != "undefined"){ + faux[attr] = v; + } + } + } + lang.mixin(faux, { + charOrCode: charOrCode, + _wasConsumed: false, + preventDefault: function(){ + faux._wasConsumed = true; + e.preventDefault(); + }, + stopPropagation: function(){ + e.stopPropagation(); + } + }); + // give web page author a chance to consume the event + //console.log(faux.type + ', charOrCode = (' + (typeof charOrCode) + ') ' + charOrCode + ', ctrl ' + !!faux.ctrlKey + ', alt ' + !!faux.altKey + ', meta ' + !!faux.metaKey + ', shift ' + !!faux.shiftKey); + if(this.onInput(faux) === false){ // return false means stop + faux.preventDefault(); + faux.stopPropagation(); + } + if(faux._wasConsumed){ + return; + } // if preventDefault was called + this.defer(function(){ + this._onInput(faux); + }); // widget notification after key has posted + if(e.type == "keypress"){ + e.stopPropagation(); // don't allow parents to stop printables from being typed + } + }; + this.own(on(this.textbox, "keydown, keypress, paste, cut, input, compositionend", lang.hitch(this, handleEvent))); + }, + + _blankValue: '', // if the textbox is blank, what value should be reported + filter: function(val){ + // summary: + // Auto-corrections (such as trimming) that are applied to textbox + // value on blur or form submit. + // description: + // For MappedTextBox subclasses, this is called twice + // + // - once with the display value + // - once the value as set/returned by set('value', ...) + // + // and get('value'), ex: a Number for NumberTextBox. + // + // In the latter case it does corrections like converting null to NaN. In + // the former case the NumberTextBox.filter() method calls this.inherited() + // to execute standard trimming code in TextBox.filter(). + // + // TODO: break this into two methods in 2.0 + // + // tags: + // protected extension + if(val === null){ + return this._blankValue; + } + if(typeof val != "string"){ + return val; + } + if(this.trim){ + val = lang.trim(val); + } + if(this.uppercase){ + val = val.toUpperCase(); + } + if(this.lowercase){ + val = val.toLowerCase(); + } + if(this.propercase){ + val = val.replace(/[^\s]+/g, function(word){ + return word.substring(0, 1).toUpperCase() + word.substring(1); + }); + } + return val; + }, + + _setBlurValue: function(){ + // Format the displayed value, for example (for NumberTextBox) convert 1.4 to 1.400, + // or (for CurrencyTextBox) 2.50 to $2.50 + + this._setValueAttr(this.get('value'), true); + }, + + _onBlur: function(e){ + if(this.disabled){ + return; + } + this._setBlurValue(); + this.inherited(arguments); + }, + + _isTextSelected: function(){ + return this.textbox.selectionStart != this.textbox.selectionEnd; + }, + + _onFocus: function(/*String*/ by){ + if(this.disabled || this.readOnly){ + return; + } + + // Select all text on focus via click if nothing already selected. + // Since mouse-up will clear the selection, need to defer selection until after mouse-up. + // Don't do anything on focus by tabbing into the widget since there's no associated mouse-up event. + if(this.selectOnClick && by == "mouse"){ + // Use on.once() to only select all text on first click only; otherwise users would have no way to clear + // the selection. + this._selectOnClickHandle = on.once(this.domNode, "mouseup, touchend", lang.hitch(this, function(evt){ + // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up) + // and if not, then select all the text + if(!this._isTextSelected()){ + _TextBoxMixin.selectInputText(this.textbox); + } + })); + this.own(this._selectOnClickHandle); + + // in case the mouseup never comes + this.defer(function(){ + if(this._selectOnClickHandle){ + this._selectOnClickHandle.remove(); + this._selectOnClickHandle = null; + } + }, 500); // if mouseup not received soon, then treat it as some gesture + } + // call this.inherited() before refreshState(), since this.inherited() will possibly scroll the viewport + // (to scroll the TextBox into view), which will affect how _refreshState() positions the tooltip + this.inherited(arguments); + + this._refreshState(); + }, + + reset: function(){ + // Overrides `dijit/_FormWidget/reset()`. + // Additionally resets the displayed textbox value to '' + this.textbox.value = ''; + this.inherited(arguments); + } + }); + + if(has("dojo-bidi")){ + _TextBoxMixin = declare("dijit.form._TextBoxMixin", _TextBoxMixin, { + _setValueAttr: function(){ + this.inherited(arguments); + this.applyTextDir(this.focusNode); + }, + _setDisplayedValueAttr: function(){ + this.inherited(arguments); + this.applyTextDir(this.focusNode); + }, + _onInput: function(){ + this.applyTextDir(this.focusNode); + this.inherited(arguments); + } + }); + } + + _TextBoxMixin._setSelectionRange = dijit._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ + if(element.setSelectionRange){ + element.setSelectionRange(start, stop); + } + }; + + _TextBoxMixin.selectInputText = dijit.selectInputText = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ + // summary: + // Select text in the input element argument, from start (default 0), to stop (default end). + + // TODO: use functions in _editor/selection.js? + element = dom.byId(element); + if(isNaN(start)){ + start = 0; + } + if(isNaN(stop)){ + stop = element.value ? element.value.length : 0; + } + try{ + element.focus(); + _TextBoxMixin._setSelectionRange(element, start, stop); + }catch(e){ /* squelch random errors (esp. on IE) from unexpected focus changes or DOM nodes being hidden */ + } + }; + + return _TextBoxMixin; +}); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SafePaste.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SafePaste.js.uncompressed.js index 6bb8f790a9..b9fda8e794 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SafePaste.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SafePaste.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/bg/SafePaste", ({ - "instructions": "Директното поставяне е деактивирано. Моля, поставете съдържанието в този диалогов прозорец като ползвате стандартната клавиатура на браузъра или контролите за поставяне в менюто. Когато сте удовлетворени със съдържанието, което вмъкване, натиснете бутона. За да прекратите вмъкването на съдържание, натиснете бутона." -}) -); +define( +"dojox/editor/plugins/nls/bg/SafePaste", ({ + "instructions": "Директното поставяне е деактивирано. Моля, поставете съдържанието в този диалогов прозорец като ползвате стандартната клавиатура на браузъра или контролите за поставяне в менюто. Когато сте удовлетворени със съдържанието, което вмъкване, натиснете бутона. За да прекратите вмъкването на съдържание, натиснете бутона." +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Save.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Save.js.uncompressed.js index c62a2e61a2..25d2f0df04 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Save.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Save.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/bg/Save", ({ - "save": "Запази" -}) -); +define( +"dojox/editor/plugins/nls/bg/Save", ({ + "save": "Запази" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/ShowBlockNodes.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/ShowBlockNodes.js.uncompressed.js index 02922d062f..391d163d8b 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/ShowBlockNodes.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/ShowBlockNodes.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/bg/ShowBlockNodes", ({ - "showBlockNodes": "Покажи HTML блокови елементи" -}) -); +define( +"dojox/editor/plugins/nls/bg/ShowBlockNodes", ({ + "showBlockNodes": "Покажи HTML блокови елементи" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Smiley.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Smiley.js.uncompressed.js index 4dd68399e7..1b9d43d3d8 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Smiley.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/Smiley.js.uncompressed.js @@ -1,24 +1,24 @@ -define( -"dojox/editor/plugins/nls/bg/Smiley", ({ - smiley: "Вмъкни емотикон", - emoticonSmile: "усмивка", - emoticonLaughing: "смях", - emoticonWink: "намигане", - emoticonGrin: "хилене", - emoticonCool: "готин", - emoticonAngry: "ядосан", - emoticonHalf: "половин усмивка", - emoticonEyebrow: "повдигната вежда", - emoticonFrown: "смръщен", - emoticonShy: "срамежлив", - emoticonGoofy: "глупав", - emoticonOops: "упс", - emoticonTongue: "изплезен", - emoticonIdea: "идея", - emoticonYes: "да", - emoticonNo: "не", - emoticonAngel: "ангел", - emoticonCrying: "плачещ", - emoticonHappy: "щастлив" -}) -); +define( +"dojox/editor/plugins/nls/bg/Smiley", ({ + smiley: "Вмъкни емотикон", + emoticonSmile: "усмивка", + emoticonLaughing: "смях", + emoticonWink: "намигане", + emoticonGrin: "хилене", + emoticonCool: "готин", + emoticonAngry: "ядосан", + emoticonHalf: "половин усмивка", + emoticonEyebrow: "повдигната вежда", + emoticonFrown: "смръщен", + emoticonShy: "срамежлив", + emoticonGoofy: "глупав", + emoticonOops: "упс", + emoticonTongue: "изплезен", + emoticonIdea: "идея", + emoticonYes: "да", + emoticonNo: "не", + emoticonAngel: "ангел", + emoticonCrying: "плачещ", + emoticonHappy: "щастлив" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SpellCheck.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SpellCheck.js.uncompressed.js index 230386c9d6..f3a0723990 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SpellCheck.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/SpellCheck.js.uncompressed.js @@ -1,18 +1,18 @@ -define( -"dojox/editor/plugins/nls/bg/SpellCheck", ({ - widgetLabel: "Проверка на правопис на групи", - unfound: "Не е намерено", - skip: "Пропусни", - skipAll: "Пропусни всички", - toDic: "Добави към речника", - suggestions: "Предложения", - replace: "Подмени", - replaceWith: "Подмени с", - replaceAll: "Подмени всички", - cancel: "Отмени", - msg: "Не са намерени грешки в правописа", - iSkip: "Пропусни това", - iSkipAll: "Пропусни всички като тези", - iMsg: "Няма предложения за изписване" -}) -); +define( +"dojox/editor/plugins/nls/bg/SpellCheck", ({ + widgetLabel: "Проверка на правопис на групи", + unfound: "Не е намерено", + skip: "Пропусни", + skipAll: "Пропусни всички", + toDic: "Добави към речника", + suggestions: "Предложения", + replace: "Подмени", + replaceWith: "Подмени с", + replaceAll: "Подмени всички", + cancel: "Отмени", + msg: "Не са намерени грешки в правописа", + iSkip: "Пропусни това", + iSkipAll: "Пропусни всички като тези", + iMsg: "Няма предложения за изписване" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TableDialog.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TableDialog.js.uncompressed.js index ab0b2a4239..35aac7fbec 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TableDialog.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TableDialog.js.uncompressed.js @@ -1,33 +1,33 @@ -define( -"dojox/editor/plugins/nls/bg/TableDialog", ({ - insertTableTitle: "Вмъкни таблица", - modifyTableTitle: "Промени таблица", - rows: "Редове:", - columns: "Колони:", - align: "Подравни:", - cellPadding: "Попълване на клетки:", - cellSpacing: "Разстояние на клетки:", - tableWidth: "Ширина на таблица:", - backgroundColor: "Цвят на фон:", - borderColor: "Цвят на граница:", - borderThickness: "Дебелина на граница:", - percent: "процент", - pixels: "пиксели", - "default": "по подразбиране", - left: "ляво", - center: "централно", - right: "дясно", - buttonSet: "Задай", // translated elsewhere? - buttonInsert: "Вмъкни", - buttonCancel: "Отмени", - selectTableLabel: "Избери таблица", - insertTableRowBeforeLabel: "Добави ред преди", - insertTableRowAfterLabel: "Добави ред след", - insertTableColumnBeforeLabel: "Добави колона преди", - insertTableColumnAfterLabel: "Добави колона след", - deleteTableRowLabel: "Изтрий ред", - deleteTableColumnLabel: "Изтрий колона", - colorTableCellTitle: "Цвят на фон на клетка на таблица", - tableContextMenuTitle: "Контекстно меню на таблица" -}) -); +define( +"dojox/editor/plugins/nls/bg/TableDialog", ({ + insertTableTitle: "Вмъкни таблица", + modifyTableTitle: "Промени таблица", + rows: "Редове:", + columns: "Колони:", + align: "Подравни:", + cellPadding: "Попълване на клетки:", + cellSpacing: "Разстояние на клетки:", + tableWidth: "Ширина на таблица:", + backgroundColor: "Цвят на фон:", + borderColor: "Цвят на граница:", + borderThickness: "Дебелина на граница:", + percent: "процент", + pixels: "пиксели", + "default": "по подразбиране", + left: "ляво", + center: "централно", + right: "дясно", + buttonSet: "Задай", // translated elsewhere? + buttonInsert: "Вмъкни", + buttonCancel: "Отмени", + selectTableLabel: "Избери таблица", + insertTableRowBeforeLabel: "Добави ред преди", + insertTableRowAfterLabel: "Добави ред след", + insertTableColumnBeforeLabel: "Добави колона преди", + insertTableColumnAfterLabel: "Добави колона след", + deleteTableRowLabel: "Изтрий ред", + deleteTableColumnLabel: "Изтрий колона", + colorTableCellTitle: "Цвят на фон на клетка на таблица", + tableContextMenuTitle: "Контекстно меню на таблица" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TextColor.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TextColor.js.uncompressed.js index 9f111e7129..a9d589e85e 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TextColor.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/bg/TextColor.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/editor/plugins/nls/bg/TextColor", ({ - "setButtonText": "Задай", - "cancelButtonText": "Отмени" -}) -); +define( +"dojox/editor/plugins/nls/bg/TextColor", ({ + "setButtonText": "Задай", + "cancelButtonText": "Отмени" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/AutoSave.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/AutoSave.js.uncompressed.js index 6e0a9d13e4..d977ed0de9 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/AutoSave.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/AutoSave.js.uncompressed.js @@ -1,15 +1,15 @@ -define( -"dojox/editor/plugins/nls/uk/AutoSave", ({ - "saveLabel": "Зберегти", - "saveSettingLabelOn": "Зазначити інтервал автозбереження...", - "saveSettingLabelOff": "Вимкнути автозбереження", - "saveSettingdialogTitle": "Автозбереження", - "saveSettingdialogDescription": "Вкажіть інтервал автозбереження", - "saveSettingdialogParamName": "Інтервал автозбереження", - "saveSettingdialogParamLabel": "хв", - "saveSettingdialogButtonOk": "Задати інтервал", - "saveSettingdialogButtonCancel": "Скасувати", - "saveMessageSuccess": "Збережено у ${0}", - "saveMessageFail": "Не вдалося зберегти у ${0}" -}) -); +define( +"dojox/editor/plugins/nls/uk/AutoSave", ({ + "saveLabel": "Зберегти", + "saveSettingLabelOn": "Зазначити інтервал автозбереження...", + "saveSettingLabelOff": "Вимкнути автозбереження", + "saveSettingdialogTitle": "Автозбереження", + "saveSettingdialogDescription": "Вкажіть інтервал автозбереження", + "saveSettingdialogParamName": "Інтервал автозбереження", + "saveSettingdialogParamLabel": "хв", + "saveSettingdialogButtonOk": "Задати інтервал", + "saveSettingdialogButtonCancel": "Скасувати", + "saveMessageSuccess": "Збережено у ${0}", + "saveMessageFail": "Не вдалося зберегти у ${0}" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Blockquote.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Blockquote.js.uncompressed.js index 440ec73a5f..1f04fc582d 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Blockquote.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Blockquote.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/uk/Blockquote", ({ - "blockquote": "Блок цитат" -}) -); +define( +"dojox/editor/plugins/nls/uk/Blockquote", ({ + "blockquote": "Блок цитат" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Breadcrumb.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Breadcrumb.js.uncompressed.js index fcc4e4ccfd..1de4c2b52d 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Breadcrumb.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Breadcrumb.js.uncompressed.js @@ -1,11 +1,11 @@ -define( -"dojox/editor/plugins/nls/uk/Breadcrumb", ({ - "nodeActions": "${nodeName}: дії", - "selectContents": "Вибрати вміст", - "selectElement": "Вибрати елемент", - "deleteElement": "Видалити елемент", - "deleteContents": "Видалити вміст", - "moveStart": "Перемістити курсор на початок", - "moveEnd": "Перемістити курсор у кінець" -}) -); +define( +"dojox/editor/plugins/nls/uk/Breadcrumb", ({ + "nodeActions": "${nodeName}: дії", + "selectContents": "Вибрати вміст", + "selectElement": "Вибрати елемент", + "deleteElement": "Видалити елемент", + "deleteContents": "Видалити вміст", + "moveStart": "Перемістити курсор на початок", + "moveEnd": "Перемістити курсор у кінець" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/CollapsibleToolbar.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/CollapsibleToolbar.js.uncompressed.js index 089ee3e52a..0947a950b0 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/CollapsibleToolbar.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/CollapsibleToolbar.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/editor/plugins/nls/uk/CollapsibleToolbar", ({ - "collapse": "Згорнути панель редагування", - "expand": "Розгорнути панель редагування" -}) -); +define( +"dojox/editor/plugins/nls/uk/CollapsibleToolbar", ({ + "collapse": "Згорнути панель редагування", + "expand": "Розгорнути панель редагування" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/FindReplace.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/FindReplace.js.uncompressed.js index 1aedc6a599..65f1113d9e 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/FindReplace.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/FindReplace.js.uncompressed.js @@ -1,23 +1,23 @@ -define( -"dojox/editor/plugins/nls/uk/FindReplace", ({ - "findLabel": "Знайти:", - "findTooltip": "Введіть текст для пошуку", - "replaceLabel": "Замінити на", - "replaceTooltip": "Введіть текст заміни", - "findReplace": "Найти та замінити", - "matchCase": "Враховувати регістр", - "matchCaseTooltip": "Враховувати регістр", - "backwards": "Назад", - "backwardsTooltip": "Пошук тексту у зворотному напрямку", - "replaceAllButton": "Замінити всі", - "replaceAllButtonTooltip": "Замінити весь текст", - "findButton": "Знайти", - "findButtonTooltip": "Знайти текст", - "replaceButton": "Замінити", - "replaceButtonTooltip": "Замінити текст", - "replaceDialogText": "Замінено ${0} входжень.", - "eofDialogText": "Останнє входження ${0}", - "eofDialogTextFind": "знайдено", - "eofDialogTextReplace": "замінено" -}) -); +define( +"dojox/editor/plugins/nls/uk/FindReplace", ({ + "findLabel": "Знайти:", + "findTooltip": "Введіть текст для пошуку", + "replaceLabel": "Замінити на", + "replaceTooltip": "Введіть текст заміни", + "findReplace": "Найти та замінити", + "matchCase": "Враховувати регістр", + "matchCaseTooltip": "Враховувати регістр", + "backwards": "Назад", + "backwardsTooltip": "Пошук тексту у зворотному напрямку", + "replaceAllButton": "Замінити всі", + "replaceAllButtonTooltip": "Замінити весь текст", + "findButton": "Знайти", + "findButtonTooltip": "Знайти текст", + "replaceButton": "Замінити", + "replaceButtonTooltip": "Замінити текст", + "replaceDialogText": "Замінено ${0} входжень.", + "eofDialogText": "Останнє входження ${0}", + "eofDialogTextFind": "знайдено", + "eofDialogTextReplace": "замінено" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertAnchor.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertAnchor.js.uncompressed.js index b76de0d65c..146ac2d55c 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertAnchor.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertAnchor.js.uncompressed.js @@ -1,10 +1,10 @@ -define( -"dojox/editor/plugins/nls/uk/InsertAnchor", ({ - insertAnchor: "Вставити мітку", - title: "Властивості мітки", - anchor: "Ім'я:", - text: "Опис:", - set: "Встановити", - cancel: "Скасувати" -}) -); +define( +"dojox/editor/plugins/nls/uk/InsertAnchor", ({ + insertAnchor: "Вставити мітку", + title: "Властивості мітки", + anchor: "Ім'я:", + text: "Опис:", + set: "Встановити", + cancel: "Скасувати" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertEntity.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertEntity.js.uncompressed.js index 04b73c5fad..c0970f0c79 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertEntity.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/InsertEntity.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/uk/InsertEntity", ({ - insertEntity: "Вставити символ" -}) -); +define( +"dojox/editor/plugins/nls/uk/InsertEntity", ({ + insertEntity: "Вставити символ" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/LocalImage.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/LocalImage.js.uncompressed.js index 7d71022044..e1de9c7e16 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/LocalImage.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/LocalImage.js.uncompressed.js @@ -1,12 +1,12 @@ -define( -"dojox/editor/plugins/nls/uk/LocalImage", ({ - insertImageTitle: "Вставити зображення", - url: "Зображення", - browse: "Огляд...", - text: "Опис", - set: "Вставити", - invalidMessage: "Неправильний тип файлу зображення", - prePopuTextUrl: "Введіть URL зображення ", - prePopuTextBrowse: " або виберіть локальний файл." -}) -); +define( +"dojox/editor/plugins/nls/uk/LocalImage", ({ + insertImageTitle: "Вставити зображення", + url: "Зображення", + browse: "Огляд...", + text: "Опис", + set: "Вставити", + invalidMessage: "Неправильний тип файлу зображення", + prePopuTextUrl: "Введіть URL зображення ", + prePopuTextBrowse: " або виберіть локальний файл." +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PageBreak.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PageBreak.js.uncompressed.js index 645166dfe3..5f4d49c1f6 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PageBreak.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PageBreak.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/uk/PageBreak", ({ - "pageBreak": "Розрив сторінки" -}) -); +define( +"dojox/editor/plugins/nls/uk/PageBreak", ({ + "pageBreak": "Розрив сторінки" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PasteFromWord.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PasteFromWord.js.uncompressed.js index f3b08980d9..96ae899815 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PasteFromWord.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/PasteFromWord.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/editor/plugins/nls/uk/PasteFromWord", ({ - "pasteFromWord": "Вставити з Word", - "instructions": "Вставка вмісту з Word до текстового поля. Після вибору вмісту для вставки натисніть кнопку Вставити. Для скасування вставки тексту натисніть кнопку Скасувати." -}) -); +define( +"dojox/editor/plugins/nls/uk/PasteFromWord", ({ + "pasteFromWord": "Вставити з Word", + "instructions": "Вставка вмісту з Word до текстового поля. Після вибору вмісту для вставки натисніть кнопку Вставити. Для скасування вставки тексту натисніть кнопку Скасувати." +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Preview.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Preview.js.uncompressed.js index ad7aa307c0..f1f6a66e3c 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Preview.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Preview.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/uk/Preview", ({ - "preview": "Попередній перегляд" -}) -); +define( +"dojox/editor/plugins/nls/uk/Preview", ({ + "preview": "Попередній перегляд" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SafePaste.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SafePaste.js.uncompressed.js index 2bb1e328dd..57dccc3f83 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SafePaste.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SafePaste.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/uk/SafePaste", ({ - "instructions": "Пряму вставку вимкнено. Вставте дані в це вікно за допомогою стандартної клавіатури браузера або пунктів меню. Вибравши вміст для вставки, натисніть кнопку Вставити. Для скасування вставки вмісту натисніть кнопку Скасувати." -}) -); +define( +"dojox/editor/plugins/nls/uk/SafePaste", ({ + "instructions": "Пряму вставку вимкнено. Вставте дані в це вікно за допомогою стандартної клавіатури браузера або пунктів меню. Вибравши вміст для вставки, натисніть кнопку Вставити. Для скасування вставки вмісту натисніть кнопку Скасувати." +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Save.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Save.js.uncompressed.js index e4c796d03d..7fb2c9f58d 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Save.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Save.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/uk/Save", ({ - "save": "Зберегти" -}) -); +define( +"dojox/editor/plugins/nls/uk/Save", ({ + "save": "Зберегти" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/ShowBlockNodes.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/ShowBlockNodes.js.uncompressed.js index 3b8ca4e8f7..7ecf8c5da5 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/ShowBlockNodes.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/ShowBlockNodes.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/editor/plugins/nls/uk/ShowBlockNodes", ({ - "showBlockNodes": "Показати елементи блока HTML" -}) -); +define( +"dojox/editor/plugins/nls/uk/ShowBlockNodes", ({ + "showBlockNodes": "Показати елементи блока HTML" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Smiley.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Smiley.js.uncompressed.js index e55435540d..2250de015c 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Smiley.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/Smiley.js.uncompressed.js @@ -1,24 +1,24 @@ -define( -"dojox/editor/plugins/nls/uk/Smiley", ({ - smiley: "Вставити символ емоції", - emoticonSmile: "посмішка", - emoticonLaughing: "сміх", - emoticonWink: "підморгування", - emoticonGrin: "хмурий", - emoticonCool: "класний", - emoticonAngry: "злий", - emoticonHalf: "половина", - emoticonEyebrow: "брова", - emoticonFrown: "насуплений", - emoticonShy: "сором'язливий", - emoticonGoofy: "безглуздий", - emoticonOops: "ой", - emoticonTongue: "язик", - emoticonIdea: "ідея", - emoticonYes: "так", - emoticonNo: "ні", - emoticonAngel: "ангел", - emoticonCrying: "плач", - emoticonHappy: "щастя" -}) -); +define( +"dojox/editor/plugins/nls/uk/Smiley", ({ + smiley: "Вставити символ емоції", + emoticonSmile: "посмішка", + emoticonLaughing: "сміх", + emoticonWink: "підморгування", + emoticonGrin: "хмурий", + emoticonCool: "класний", + emoticonAngry: "злий", + emoticonHalf: "половина", + emoticonEyebrow: "брова", + emoticonFrown: "насуплений", + emoticonShy: "сором'язливий", + emoticonGoofy: "безглуздий", + emoticonOops: "ой", + emoticonTongue: "язик", + emoticonIdea: "ідея", + emoticonYes: "так", + emoticonNo: "ні", + emoticonAngel: "ангел", + emoticonCrying: "плач", + emoticonHappy: "щастя" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SpellCheck.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SpellCheck.js.uncompressed.js index 2bbd09db95..63db16bada 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SpellCheck.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/SpellCheck.js.uncompressed.js @@ -1,18 +1,18 @@ -define( -"dojox/editor/plugins/nls/uk/SpellCheck", ({ - widgetLabel: "Перевірка правопису", - unfound: "Не знайдено", - skip: "Пропустити", - skipAll: "Пропустити всі", - toDic: "Додати до словника", - suggestions: "Варіанти", - replace: "Замінити", - replaceWith: "Замінити на", - replaceAll: "Замінити всі", - cancel: "Скасувати", - msg: "Помилок не знайдено", - iSkip: "Пропустити це", - iSkipAll: "Пропустити всі", - iMsg: "Немає варіантів" -}) -); +define( +"dojox/editor/plugins/nls/uk/SpellCheck", ({ + widgetLabel: "Перевірка правопису", + unfound: "Не знайдено", + skip: "Пропустити", + skipAll: "Пропустити всі", + toDic: "Додати до словника", + suggestions: "Варіанти", + replace: "Замінити", + replaceWith: "Замінити на", + replaceAll: "Замінити всі", + cancel: "Скасувати", + msg: "Помилок не знайдено", + iSkip: "Пропустити це", + iSkipAll: "Пропустити всі", + iMsg: "Немає варіантів" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TableDialog.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TableDialog.js.uncompressed.js index c2f2cb8963..4d2625354e 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TableDialog.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TableDialog.js.uncompressed.js @@ -1,33 +1,33 @@ -define( -"dojox/editor/plugins/nls/uk/TableDialog", ({ - insertTableTitle: "Вставити таблицю", - modifyTableTitle: "Змінити таблицю", - rows: "Рядки:", - columns: "Стовпці:", - align: "Вирівнювання:", - cellPadding: "Відступ всередині комірок:", - cellSpacing: "Відстань між комірками:", - tableWidth: "Ширина таблиці:", - backgroundColor: "Колір фону:", - borderColor: "Колір рамки:", - borderThickness: "Товщина рамки:", - percent: "відсотки", - pixels: "пікселі", - "default": "за замовчуванням", - left: "зліва", - center: "у центрі", - right: "справа", - buttonSet: "Встановити", // translated elsewhere? - buttonInsert: "Вставити", - buttonCancel: "Скасувати", - selectTableLabel: "Виберіть таблицю", - insertTableRowBeforeLabel: "Додати рядок вище", - insertTableRowAfterLabel: "Додати рядок нижче", - insertTableColumnBeforeLabel: "Додати стовпець зліва", - insertTableColumnAfterLabel: "Додати стовпець справа", - deleteTableRowLabel: "Видалити рядок", - deleteTableColumnLabel: "Видалити стовпчик", - colorTableCellTitle: "Колір фону - комірка таблиці", - tableContextMenuTitle: "Контекстне меню таблиці" -}) -); +define( +"dojox/editor/plugins/nls/uk/TableDialog", ({ + insertTableTitle: "Вставити таблицю", + modifyTableTitle: "Змінити таблицю", + rows: "Рядки:", + columns: "Стовпці:", + align: "Вирівнювання:", + cellPadding: "Відступ всередині комірок:", + cellSpacing: "Відстань між комірками:", + tableWidth: "Ширина таблиці:", + backgroundColor: "Колір фону:", + borderColor: "Колір рамки:", + borderThickness: "Товщина рамки:", + percent: "відсотки", + pixels: "пікселі", + "default": "за замовчуванням", + left: "зліва", + center: "у центрі", + right: "справа", + buttonSet: "Встановити", // translated elsewhere? + buttonInsert: "Вставити", + buttonCancel: "Скасувати", + selectTableLabel: "Виберіть таблицю", + insertTableRowBeforeLabel: "Додати рядок вище", + insertTableRowAfterLabel: "Додати рядок нижче", + insertTableColumnBeforeLabel: "Додати стовпець зліва", + insertTableColumnAfterLabel: "Додати стовпець справа", + deleteTableRowLabel: "Видалити рядок", + deleteTableColumnLabel: "Видалити стовпчик", + colorTableCellTitle: "Колір фону - комірка таблиці", + tableContextMenuTitle: "Контекстне меню таблиці" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TextColor.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TextColor.js.uncompressed.js index 75b5567bb3..34a56704be 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TextColor.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/TextColor.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/editor/plugins/nls/uk/TextColor", ({ - "setButtonText": "Встановити", - "cancelButtonText": "Скасувати" -}) -); +define( +"dojox/editor/plugins/nls/uk/TextColor", ({ + "setButtonText": "Встановити", + "cancelButtonText": "Скасувати" +}) +); diff --git a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/latinEntities.js.uncompressed.js b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/latinEntities.js.uncompressed.js index 2f6ae7e454..db9195e2e7 100644 --- a/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/latinEntities.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/editor/plugins/nls/uk/latinEntities.js.uncompressed.js @@ -1,257 +1,257 @@ -define( -"dojox/editor/plugins/nls/uk/latinEntities", ({ - /* These are already handled in the default RTE - amp:"ampersand",lt:"less-than sign", - gt:"greater-than sign", - nbsp:"no-break space\nnon-breaking space", - quot:"quote", - */ - iexcl:"інвертований знак оклику", - cent:"символ центу", - pound:"символ фунту", - curren:"символ грошової одиниці", - yen:"символ ієни\nсимвол юаня", - brvbar:"переривчаста риса\nвертикальна переривчаста риса", - sect:"символ розділу", - uml:"трема\nтрема з інтервалом", - copy:"символ авторських прав", - ordf:"індикатор жіночого роду", - laquo:"ліві подвійні кутові лапки\nліві лапки", - not:"символ заперечення", - shy:"м'яке перенесення\nможливе перенесення", - reg:"символ Зареєстрований\nсимвол зареєстрованого товарного знака", - macr:"знак довготи\nзнак довготи з інтервалом\верхня риса\nнадкреслення APL", - deg:"символ градусів", - plusmn:"знак плюс-мінус\nзнак плюсу або мінусу", - sup2:"верхній індекс два\nверхній індекс з цифрою два\nзведення у квадрат", - sup3:"верхній індекс три\nверхній індекс з цифрою три\nзведення у куб", - acute:"знак акут\nакут з інтервалом", - micro:"знак мікро", - para:"символ абзацу\nсимвол параграфу", - middot:"середня точка\nкома у грузинському\nсередня точка у грецькому", - cedil:"седиль\nседиль з інтервалом", - sup1:"верхній індекс один\nверхній індекс з цифрою один", - ordm:"індикатор чоловічого роду", - raquo:"Права подвійна кутова лапка\nправа лапка", - frac14:"дріб одна четверта\nодна чверть", - frac12:"дріб одна друга\nодна друга", - frac34:"дріб три чверті\nтри чверті", - iquest:"інвертований знак питання\nперевернутий знак питання", - Agrave:"латинська прописна буква А з гравісом\nлатинська прописна буква А з гравісом", - Aacute:"латинська прописна буква A з акутом", - Acirc:"латинська прописна буква A з циркумфлексом", - Atilde:"латинська прописна буква A з тильдою", - Auml:"латинська прописна буква A з тремою", - Aring:"латинська прописна буква A з кружечком угорі\nлатинська прописна буква A з кружечком", - AElig:"латинська прописна буква AE\nлатинська прописна лигатура AE", - Ccedil:"латинська прописна буква C з седиллю", - Egrave:"латинська прописна буква E з гравісом", - Eacute:"латинська прописна буква Е з акутом", - Ecirc:"латинська прописна буква E з циркумфлексом", - Euml:"латинська прописна буква Е з тремою", - Igrave:"латинська прописна буква I з грависом", - Iacute:"латинська прописна буква І з акутом", - Icirc:"латинська прописна буква І з циркумфлексом", - Iuml:"латинська прописна буква І з тремою", - ETH:"латинська прописна буква ETH", - Ntilde:"латинська прописна буква N з тильдою", - Ograve:"латинська прописна буква O з грависом", - Oacute:"латинська прописна буква O з акутом", - Ocirc:"латинська прописна буква O з циркумфлексом", - Otilde:"латинська прописна буква O з тильдою", - Ouml:"латинська прописна буква O з тремою", - times:"знак множення", - Oslash:"латинська прописна буква O перекреслена\nлатинська прописна буква O з вертикальною рисою", - Ugrave:"латинська прописна буква U з грависом", - Uacute:"латинська прописна буква U з акутом", - Ucirc:"латинська прописна буква U з циркумфлексом", - Uuml:"латинська прописна буква U з тремою", - Yacute:"латинська прописна буква Y з акутом", - THORN:"латинська прописна буква THORN", - szlig:"латинська мала загострена есцет\есцет", - agrave:"латинська мала літера a з грависом\nлатинська мала а з грависом", - aacute:"латинська мала літера a з акутом", - acirc:"латинська мала літера a з циркумфлексом", - atilde:"латинська мала літера a з тильдою", - auml:"латинська мала літера a з тремою", - aring:"латинська мала літера a з кружечком угорі\nлатинська мала літера a з кружечком", - aelig:"латинська мала літера ae\nлатинська мала лігатура ae", - ccedil:"латинська мала літера c з седиллю", - egrave:"латинська мала літера e з грависом", - eacute:"латинська мала літера e з акутом", - ecirc:"латинська мала літера e з циркумфлексом", - euml:"латинська мала літера e з тремою", - igrave:"латинська мала літера i з грависом", - iacute:"латинська мала літера i з акутом", - icirc:"латинська мала літера i з циркумфлексом", - iuml:"латинська мала літера i з тремою", - eth:"латинська мала літера eth", - ntilde:"латинська мала літера n з тильдою", - ograve:"латинська мала літера o з грависом", - oacute:"латинська мала літера o з акутом", - ocirc:"латинська мала літера o з циркумфлексом", - otilde:"латинська мала літера o з тильдою", - ouml:"латинська мала літера o з тремою", - divide:"знак ділення", - oslash:"латинська мала літера o перекреслена\nwith stroke o з вертикальною рисою", - ugrave:"латинська мала літера u з грависом", - uacute:"латинська мала літера u з акутом", - ucirc:"латинська мала літера u з циркумфлексом", - uuml:"латинська мала літера u з тремою", - yacute:"латинська мала літера y з акутом", - thorn:"латинська мала літера thorn", - yuml:"латинська мала літера y з тремою", -// Greek Characters and Symbols - fnof:"латинська мала літера f з хвостиком\nфункція\nфлорин", - Alpha:"грецька прописна літера альфа", - Beta:"грецька прописна літера бета", - Gamma:"грецька прописна літера гамма", - Delta:"грецька прописна літера дельта", - Epsilon:"грецька прописна літера епсілон", - Zeta:"грецька прописна літера дзета", - Eta:"грецька прописна літера ета", - Theta:"грецька прописна літера тета", - Iota:"грецька прописна літера йота", - Kappa:"грецька прописна літера каппа", - Lambda:"грецька прописна літера лямбда", - Mu:"грецька прописна літера мю", - Nu:"грецька прописна літера ню", - Xi:"грецька прописна літера ксі", - Omicron:"грецька прописна літера омікрон", - Pi:"грецька прописна літера пі", - Rho:"грецька прописна літера ро", - Sigma:"грецька прописна літера сігма", - Tau:"грецька прописна літера тау", - Upsilon:"грецька прописна літера іпсілон", - Phi:"грецька прописна літера фі", - Chi:"грецька прописна літера хі", - Psi:"грецька прописна літера псі", - Omega:"грецька прописна літера омега", - alpha:"грецька мала літера альфа", - beta:"грецька мала літера бета", - gamma:"грецька мала літера гамма", - delta:"грецька мала літера дельта", - epsilon:"грецька мала літера епсілон", - zeta:"грецька мала літера дзета", - eta:"грецька мала літера ета", - theta:"грецька мала літера тета", - iota:"грецька мала літера йота", - kappa:"грецька мала літера каппа", - lambda:"грецька мала літера лямбда", - mu:"грецька мала літера мю", - nu:"грецька мала літера ню", - xi:"грецька мала літера ксі", - omicron:"грецька мала літера омікрон", - pi:"грецька мала літера пі", - rho:"грецька мала літера ро", - sigmaf:"грецька мала літера кінцева сігма", - sigma:"грецька мала літера сігма", - tau:"грецька мала літера тау", - upsilon:"грецька мала літера іпсілон", - phi:"грецька мала літера фі", - chi:"грецька мала літера хі", - psi:"грецька мала літера псі", - omega:"грецька мала літера омега", - thetasym:"грецька символьна тета", - upsih:"грецький іпсілон з хвостиком", - piv:"грецький символ пі", - bull:"маркер списку\nчорний маленький кружечок", - hellip:"багатокрапка\nтри крапки", - prime:"штрих\nхвилини\nфути", - Prime:"подвійний штрих\nсекунди\nдюйми", - oline:"верхня риса\nнадкреслення з інтервалом", - frasl:"коса риса", - weierp:"рукописна прописна P\nступінна множина\nфункции Вейєрштрасса", - image:"чорна прописна I\nуявна частина", - real:"чорна прописна R\nдійсна частина", - trade:"стивол товарного знака", - alefsym:"буква Алеф\nперше трансфінітне кардинальне число", - larr:"стрілка вліво", - uarr:"стрілка угору", - rarr:"стрілка вправо", - darr:"стрілка вниз", - harr:"стрілка вліво-вправо", - crarr:"стрілка вниз з кутом вправо\nповернення каретки", - lArr:"подвійна стрілка вліво", - uArr:"подвійна стрілка угору", - rArr:"подвійна стрілка вправо", - dArr:"подвійна стрілка вниз", - hArr:"подвійна стрілка вліво-вправо", - forall:"для всіх", - part:"частковий диференціал", - exist:"існує", - empty:"порожній набір\nпорожня множина\nдіаметр", - nabla:"оператор набла\nрізницеве відношення назад", - isin:"є елементом", - notin:"не є елементом", - ni:"містить як елемент", - prod:"n-арний добуток\nзнак добутку", - sum:"n-арне підсумовування", - minus:"знак мінус", - lowast:"оператор зірочка", - radic:"квадратний корінь\nзнак кореня", - prop:"пропорційно", - infin:"нескінченність", - ang:"кут", - and:"логічне І\nклин угору", - or:"логічне АБО\nклин вниз", - cap:"перетин\nшапочка", - cup:"об'єднання\nчашечка","int":"інтеграл", - there4:"отже", - sim:"оператор тильда\nзмінюватися з\nподібно до", - cong:"приблизно дорівнює", - asymp:"майже дорівнює\nасимптотично", - ne:"не дорівнює", - equiv:"ідентично", - le:"менш ніж або дорівнює", - ge:"більш ніж або дорівнює", - sub:"підмножина", - sup:"включає до себе", - nsub:"не є підмножиною", - sube:"є підмножиною або еквівалентно", - supe:"включає до себе або еквівалентно", - oplus:"плюс у колі\nпряма сума", - otimes:"множення у колі\nвекторний добуток", - perp:"перевернений гвіздок\nортогонально\nперпендикулярно", - sdot:"оператор крапка", - lceil:"ліва дужка округлювання угору\nAPL upstile", - rceil:"права дужка округлювання угору", - lfloor:"ліва дужка округлювання вниз\nAPL downstile", - rfloor:"ліва дужка округлювання вниз", - lang:"ліва кутова дужка", - rang:"права кутова дужка", - loz:"ромб", - spades:"піки", - clubs:"трефи\nтрилисник", - hearts:"чирва\nвалентинка", - diams:"бубни", - OElig:"латинська прописна лігатура OE", - oelig:"латинська мала лігатура oe", - Scaron:"латинська прописна літера S з галочкою", - scaron:"латинська мала літера s з галочкою", - Yuml:"латинська прописна літера Y з тремою", - circ:"надрядковий знак циркумфлекс", - tilde:"мала тильда", - ensp:"пробіл довжини N", - emsp:"пробіл довжини М", - thinsp:"вузький пробіл", - zwnj:"роздільник нульової ширини", - zwj:"з'єднувач нульової ширини", - lrm:"знак зліва-направо", - rlm:"знак справа-наліво", - ndash:"коротке тире", - mdash:"довге тире", - lsquo:"ліва одинарна лапка", - rsquo:"права одинарна лапка", - sbquo:"одинарна нижня лапка", - ldquo:"ліва подвійна лапка", - rdquo:"права подвійна лапка", - bdquo:"подвійна нижня лапка", - dagger:"хрест", - Dagger:"подвійний хрест", - permil:"знак проміле", - lsaquo:"одинарна ліва кутова лапка", - rsaquo:"одинарна права кутова лапка", - euro:"знак євро" -}) -); +define( +"dojox/editor/plugins/nls/uk/latinEntities", ({ + /* These are already handled in the default RTE + amp:"ampersand",lt:"less-than sign", + gt:"greater-than sign", + nbsp:"no-break space\nnon-breaking space", + quot:"quote", + */ + iexcl:"інвертований знак оклику", + cent:"символ центу", + pound:"символ фунту", + curren:"символ грошової одиниці", + yen:"символ ієни\nсимвол юаня", + brvbar:"переривчаста риса\nвертикальна переривчаста риса", + sect:"символ розділу", + uml:"трема\nтрема з інтервалом", + copy:"символ авторських прав", + ordf:"індикатор жіночого роду", + laquo:"ліві подвійні кутові лапки\nліві лапки", + not:"символ заперечення", + shy:"м'яке перенесення\nможливе перенесення", + reg:"символ Зареєстрований\nсимвол зареєстрованого товарного знака", + macr:"знак довготи\nзнак довготи з інтервалом\верхня риса\nнадкреслення APL", + deg:"символ градусів", + plusmn:"знак плюс-мінус\nзнак плюсу або мінусу", + sup2:"верхній індекс два\nверхній індекс з цифрою два\nзведення у квадрат", + sup3:"верхній індекс три\nверхній індекс з цифрою три\nзведення у куб", + acute:"знак акут\nакут з інтервалом", + micro:"знак мікро", + para:"символ абзацу\nсимвол параграфу", + middot:"середня точка\nкома у грузинському\nсередня точка у грецькому", + cedil:"седиль\nседиль з інтервалом", + sup1:"верхній індекс один\nверхній індекс з цифрою один", + ordm:"індикатор чоловічого роду", + raquo:"Права подвійна кутова лапка\nправа лапка", + frac14:"дріб одна четверта\nодна чверть", + frac12:"дріб одна друга\nодна друга", + frac34:"дріб три чверті\nтри чверті", + iquest:"інвертований знак питання\nперевернутий знак питання", + Agrave:"латинська прописна буква А з гравісом\nлатинська прописна буква А з гравісом", + Aacute:"латинська прописна буква A з акутом", + Acirc:"латинська прописна буква A з циркумфлексом", + Atilde:"латинська прописна буква A з тильдою", + Auml:"латинська прописна буква A з тремою", + Aring:"латинська прописна буква A з кружечком угорі\nлатинська прописна буква A з кружечком", + AElig:"латинська прописна буква AE\nлатинська прописна лигатура AE", + Ccedil:"латинська прописна буква C з седиллю", + Egrave:"латинська прописна буква E з гравісом", + Eacute:"латинська прописна буква Е з акутом", + Ecirc:"латинська прописна буква E з циркумфлексом", + Euml:"латинська прописна буква Е з тремою", + Igrave:"латинська прописна буква I з грависом", + Iacute:"латинська прописна буква І з акутом", + Icirc:"латинська прописна буква І з циркумфлексом", + Iuml:"латинська прописна буква І з тремою", + ETH:"латинська прописна буква ETH", + Ntilde:"латинська прописна буква N з тильдою", + Ograve:"латинська прописна буква O з грависом", + Oacute:"латинська прописна буква O з акутом", + Ocirc:"латинська прописна буква O з циркумфлексом", + Otilde:"латинська прописна буква O з тильдою", + Ouml:"латинська прописна буква O з тремою", + times:"знак множення", + Oslash:"латинська прописна буква O перекреслена\nлатинська прописна буква O з вертикальною рисою", + Ugrave:"латинська прописна буква U з грависом", + Uacute:"латинська прописна буква U з акутом", + Ucirc:"латинська прописна буква U з циркумфлексом", + Uuml:"латинська прописна буква U з тремою", + Yacute:"латинська прописна буква Y з акутом", + THORN:"латинська прописна буква THORN", + szlig:"латинська мала загострена есцет\есцет", + agrave:"латинська мала літера a з грависом\nлатинська мала а з грависом", + aacute:"латинська мала літера a з акутом", + acirc:"латинська мала літера a з циркумфлексом", + atilde:"латинська мала літера a з тильдою", + auml:"латинська мала літера a з тремою", + aring:"латинська мала літера a з кружечком угорі\nлатинська мала літера a з кружечком", + aelig:"латинська мала літера ae\nлатинська мала лігатура ae", + ccedil:"латинська мала літера c з седиллю", + egrave:"латинська мала літера e з грависом", + eacute:"латинська мала літера e з акутом", + ecirc:"латинська мала літера e з циркумфлексом", + euml:"латинська мала літера e з тремою", + igrave:"латинська мала літера i з грависом", + iacute:"латинська мала літера i з акутом", + icirc:"латинська мала літера i з циркумфлексом", + iuml:"латинська мала літера i з тремою", + eth:"латинська мала літера eth", + ntilde:"латинська мала літера n з тильдою", + ograve:"латинська мала літера o з грависом", + oacute:"латинська мала літера o з акутом", + ocirc:"латинська мала літера o з циркумфлексом", + otilde:"латинська мала літера o з тильдою", + ouml:"латинська мала літера o з тремою", + divide:"знак ділення", + oslash:"латинська мала літера o перекреслена\nwith stroke o з вертикальною рисою", + ugrave:"латинська мала літера u з грависом", + uacute:"латинська мала літера u з акутом", + ucirc:"латинська мала літера u з циркумфлексом", + uuml:"латинська мала літера u з тремою", + yacute:"латинська мала літера y з акутом", + thorn:"латинська мала літера thorn", + yuml:"латинська мала літера y з тремою", +// Greek Characters and Symbols + fnof:"латинська мала літера f з хвостиком\nфункція\nфлорин", + Alpha:"грецька прописна літера альфа", + Beta:"грецька прописна літера бета", + Gamma:"грецька прописна літера гамма", + Delta:"грецька прописна літера дельта", + Epsilon:"грецька прописна літера епсілон", + Zeta:"грецька прописна літера дзета", + Eta:"грецька прописна літера ета", + Theta:"грецька прописна літера тета", + Iota:"грецька прописна літера йота", + Kappa:"грецька прописна літера каппа", + Lambda:"грецька прописна літера лямбда", + Mu:"грецька прописна літера мю", + Nu:"грецька прописна літера ню", + Xi:"грецька прописна літера ксі", + Omicron:"грецька прописна літера омікрон", + Pi:"грецька прописна літера пі", + Rho:"грецька прописна літера ро", + Sigma:"грецька прописна літера сігма", + Tau:"грецька прописна літера тау", + Upsilon:"грецька прописна літера іпсілон", + Phi:"грецька прописна літера фі", + Chi:"грецька прописна літера хі", + Psi:"грецька прописна літера псі", + Omega:"грецька прописна літера омега", + alpha:"грецька мала літера альфа", + beta:"грецька мала літера бета", + gamma:"грецька мала літера гамма", + delta:"грецька мала літера дельта", + epsilon:"грецька мала літера епсілон", + zeta:"грецька мала літера дзета", + eta:"грецька мала літера ета", + theta:"грецька мала літера тета", + iota:"грецька мала літера йота", + kappa:"грецька мала літера каппа", + lambda:"грецька мала літера лямбда", + mu:"грецька мала літера мю", + nu:"грецька мала літера ню", + xi:"грецька мала літера ксі", + omicron:"грецька мала літера омікрон", + pi:"грецька мала літера пі", + rho:"грецька мала літера ро", + sigmaf:"грецька мала літера кінцева сігма", + sigma:"грецька мала літера сігма", + tau:"грецька мала літера тау", + upsilon:"грецька мала літера іпсілон", + phi:"грецька мала літера фі", + chi:"грецька мала літера хі", + psi:"грецька мала літера псі", + omega:"грецька мала літера омега", + thetasym:"грецька символьна тета", + upsih:"грецький іпсілон з хвостиком", + piv:"грецький символ пі", + bull:"маркер списку\nчорний маленький кружечок", + hellip:"багатокрапка\nтри крапки", + prime:"штрих\nхвилини\nфути", + Prime:"подвійний штрих\nсекунди\nдюйми", + oline:"верхня риса\nнадкреслення з інтервалом", + frasl:"коса риса", + weierp:"рукописна прописна P\nступінна множина\nфункции Вейєрштрасса", + image:"чорна прописна I\nуявна частина", + real:"чорна прописна R\nдійсна частина", + trade:"стивол товарного знака", + alefsym:"буква Алеф\nперше трансфінітне кардинальне число", + larr:"стрілка вліво", + uarr:"стрілка угору", + rarr:"стрілка вправо", + darr:"стрілка вниз", + harr:"стрілка вліво-вправо", + crarr:"стрілка вниз з кутом вправо\nповернення каретки", + lArr:"подвійна стрілка вліво", + uArr:"подвійна стрілка угору", + rArr:"подвійна стрілка вправо", + dArr:"подвійна стрілка вниз", + hArr:"подвійна стрілка вліво-вправо", + forall:"для всіх", + part:"частковий диференціал", + exist:"існує", + empty:"порожній набір\nпорожня множина\nдіаметр", + nabla:"оператор набла\nрізницеве відношення назад", + isin:"є елементом", + notin:"не є елементом", + ni:"містить як елемент", + prod:"n-арний добуток\nзнак добутку", + sum:"n-арне підсумовування", + minus:"знак мінус", + lowast:"оператор зірочка", + radic:"квадратний корінь\nзнак кореня", + prop:"пропорційно", + infin:"нескінченність", + ang:"кут", + and:"логічне І\nклин угору", + or:"логічне АБО\nклин вниз", + cap:"перетин\nшапочка", + cup:"об'єднання\nчашечка","int":"інтеграл", + there4:"отже", + sim:"оператор тильда\nзмінюватися з\nподібно до", + cong:"приблизно дорівнює", + asymp:"майже дорівнює\nасимптотично", + ne:"не дорівнює", + equiv:"ідентично", + le:"менш ніж або дорівнює", + ge:"більш ніж або дорівнює", + sub:"підмножина", + sup:"включає до себе", + nsub:"не є підмножиною", + sube:"є підмножиною або еквівалентно", + supe:"включає до себе або еквівалентно", + oplus:"плюс у колі\nпряма сума", + otimes:"множення у колі\nвекторний добуток", + perp:"перевернений гвіздок\nортогонально\nперпендикулярно", + sdot:"оператор крапка", + lceil:"ліва дужка округлювання угору\nAPL upstile", + rceil:"права дужка округлювання угору", + lfloor:"ліва дужка округлювання вниз\nAPL downstile", + rfloor:"ліва дужка округлювання вниз", + lang:"ліва кутова дужка", + rang:"права кутова дужка", + loz:"ромб", + spades:"піки", + clubs:"трефи\nтрилисник", + hearts:"чирва\nвалентинка", + diams:"бубни", + OElig:"латинська прописна лігатура OE", + oelig:"латинська мала лігатура oe", + Scaron:"латинська прописна літера S з галочкою", + scaron:"латинська мала літера s з галочкою", + Yuml:"латинська прописна літера Y з тремою", + circ:"надрядковий знак циркумфлекс", + tilde:"мала тильда", + ensp:"пробіл довжини N", + emsp:"пробіл довжини М", + thinsp:"вузький пробіл", + zwnj:"роздільник нульової ширини", + zwj:"з'єднувач нульової ширини", + lrm:"знак зліва-направо", + rlm:"знак справа-наліво", + ndash:"коротке тире", + mdash:"довге тире", + lsquo:"ліва одинарна лапка", + rsquo:"права одинарна лапка", + sbquo:"одинарна нижня лапка", + ldquo:"ліва подвійна лапка", + rdquo:"права подвійна лапка", + bdquo:"подвійна нижня лапка", + dagger:"хрест", + Dagger:"подвійний хрест", + permil:"знак проміле", + lsaquo:"одинарна ліва кутова лапка", + rsaquo:"одинарна права кутова лапка", + euro:"знак євро" +}) +); diff --git a/Core/dojo-build/dist/dojox/form/nls/bg/CheckedMultiSelect.js.uncompressed.js b/Core/dojo-build/dist/dojox/form/nls/bg/CheckedMultiSelect.js.uncompressed.js index 057173d6ee..7700016568 100644 --- a/Core/dojo-build/dist/dojox/form/nls/bg/CheckedMultiSelect.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/form/nls/bg/CheckedMultiSelect.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/form/nls/bg/CheckedMultiSelect", ({ - invalidMessage: "Трябва да бъде избран поне един елемент.", - multiSelectLabelText: "избран/и {num} елемент/и" -}) -); +define( +"dojox/form/nls/bg/CheckedMultiSelect", ({ + invalidMessage: "Трябва да бъде избран поне един елемент.", + multiSelectLabelText: "избран/и {num} елемент/и" +}) +); diff --git a/Core/dojo-build/dist/dojox/form/nls/bg/PasswordValidator.js.uncompressed.js b/Core/dojo-build/dist/dojox/form/nls/bg/PasswordValidator.js.uncompressed.js index 4ca0c642ad..9570f782e8 100644 --- a/Core/dojo-build/dist/dojox/form/nls/bg/PasswordValidator.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/form/nls/bg/PasswordValidator.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/form/nls/bg/PasswordValidator", ({ - nomatchMessage: "Паролите не съвпадат.", - badPasswordMessage: "Невалидна парола." -}) -); +define( +"dojox/form/nls/bg/PasswordValidator", ({ + nomatchMessage: "Паролите не съвпадат.", + badPasswordMessage: "Невалидна парола." +}) +); diff --git a/Core/dojo-build/dist/dojox/form/nls/bg/Uploader.js.uncompressed.js b/Core/dojo-build/dist/dojox/form/nls/bg/Uploader.js.uncompressed.js index e364455265..b5133d4b0a 100644 --- a/Core/dojo-build/dist/dojox/form/nls/bg/Uploader.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/form/nls/bg/Uploader.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/form/nls/bg/Uploader", ({ - label: "Избери файлове..." -}) -); +define( +"dojox/form/nls/bg/Uploader", ({ + label: "Избери файлове..." +}) +); diff --git a/Core/dojo-build/dist/dojox/form/nls/uk/CheckedMultiSelect.js.uncompressed.js b/Core/dojo-build/dist/dojox/form/nls/uk/CheckedMultiSelect.js.uncompressed.js index c762f463a3..0ccff725ef 100644 --- a/Core/dojo-build/dist/dojox/form/nls/uk/CheckedMultiSelect.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/form/nls/uk/CheckedMultiSelect.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/form/nls/uk/CheckedMultiSelect", ({ - invalidMessage: "Виберіть принаймні один елемент.", - multiSelectLabelText: "вибрано {num} елементів" -}) -); +define( +"dojox/form/nls/uk/CheckedMultiSelect", ({ + invalidMessage: "Виберіть принаймні один елемент.", + multiSelectLabelText: "вибрано {num} елементів" +}) +); diff --git a/Core/dojo-build/dist/dojox/form/nls/uk/PasswordValidator.js.uncompressed.js b/Core/dojo-build/dist/dojox/form/nls/uk/PasswordValidator.js.uncompressed.js index 8540fa1ed1..5dd4d1ea54 100644 --- a/Core/dojo-build/dist/dojox/form/nls/uk/PasswordValidator.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/form/nls/uk/PasswordValidator.js.uncompressed.js @@ -1,6 +1,6 @@ -define( -"dojox/form/nls/uk/PasswordValidator", ({ - nomatchMessage: "Паролі не співпадають.", - badPasswordMessage: "Неправильний пароль." -}) -); +define( +"dojox/form/nls/uk/PasswordValidator", ({ + nomatchMessage: "Паролі не співпадають.", + badPasswordMessage: "Неправильний пароль." +}) +); diff --git a/Core/dojo-build/dist/dojox/form/nls/uk/Uploader.js.uncompressed.js b/Core/dojo-build/dist/dojox/form/nls/uk/Uploader.js.uncompressed.js index bb1a2d0315..faabe10f17 100644 --- a/Core/dojo-build/dist/dojox/form/nls/uk/Uploader.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/form/nls/uk/Uploader.js.uncompressed.js @@ -1,5 +1,5 @@ -define( -"dojox/form/nls/uk/Uploader", ({ - label: "Виберіть файли..." -}) -); +define( +"dojox/form/nls/uk/Uploader", ({ + label: "Виберіть файли..." +}) +); diff --git a/Core/dojo-build/dist/dojox/gantt/README b/Core/dojo-build/dist/dojox/gantt/README index 2d73528d15..ab65466f3b 100644 --- a/Core/dojo-build/dist/dojox/gantt/README +++ b/Core/dojo-build/dist/dojox/gantt/README @@ -1,45 +1,45 @@ -------------------------------------------------------------------------------- -dojox.gantt -------------------------------------------------------------------------------- -Version 0.100 -Release date: 12/23/2010 -------------------------------------------------------------------------------- -Project state: -alpha -------------------------------------------------------------------------------- -Credits -Tom Trenka (ttrenka@dojotoolkit.org) -Xiang Zhou (xiangxz@cn.ibm.com) - IBM, CCLA -Adam Peller (peller@dojotoolkit.org) -Dylan Schiemann (dylan@dojotoolkit.org) -Bill Keese (bill@dojotoolkit.org) -Peter Higgins (dante@dojotoolkit.org) - -------------------------------------------------------------------------------- -Project description - -GanttChart(dojox.gantt.GanttChart) is an integrated widget for project and resource management use. It includes a set of features as follows. - - Toolbar - Providing general time line control and save/load button. - Project Tree - Listing projects and their tasks. - Task Cascade View - A task view with dependency, that can be modified visually. - Resource View - A read-only view shows people resource occupation. - - -------------------------------------------------------------------------------- -Dependencies: - -Dojo Core, Dijit. -------------------------------------------------------------------------------- -Documentation - -[TODO] -------------------------------------------------------------------------------- -Installation instructions - -Grab the following from the Dojo SVN Repository: -http://svn.dojotoolkit.org/src/dojox/trunk/gantt/* - -Install into the following directory structure: -/dojox/gantt/ -------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +dojox.gantt +------------------------------------------------------------------------------- +Version 0.100 +Release date: 12/23/2010 +------------------------------------------------------------------------------- +Project state: +alpha +------------------------------------------------------------------------------- +Credits +Tom Trenka (ttrenka@dojotoolkit.org) +Xiang Zhou (xiangxz@cn.ibm.com) - IBM, CCLA +Adam Peller (peller@dojotoolkit.org) +Dylan Schiemann (dylan@dojotoolkit.org) +Bill Keese (bill@dojotoolkit.org) +Peter Higgins (dante@dojotoolkit.org) + +------------------------------------------------------------------------------- +Project description + +GanttChart(dojox.gantt.GanttChart) is an integrated widget for project and resource management use. It includes a set of features as follows. + + Toolbar - Providing general time line control and save/load button. + Project Tree - Listing projects and their tasks. + Task Cascade View - A task view with dependency, that can be modified visually. + Resource View - A read-only view shows people resource occupation. + + +------------------------------------------------------------------------------- +Dependencies: + +Dojo Core, Dijit. +------------------------------------------------------------------------------- +Documentation + +[TODO] +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/src/dojox/trunk/gantt/* + +Install into the following directory structure: +/dojox/gantt/ +------------------------------------------------------------------------------- diff --git a/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/EnhancedGrid.js.uncompressed.js b/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/EnhancedGrid.js.uncompressed.js index 173e105aa1..0b64b36a65 100644 --- a/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/EnhancedGrid.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/EnhancedGrid.js.uncompressed.js @@ -1,13 +1,13 @@ -define( -"dojox/grid/enhanced/nls/bg/EnhancedGrid", ({ - singleSort: "Единично сортиране", - nestedSort: "Вградено сортиране", - ascending: "Щракнете, за да сортирате във възходящ ред", - descending: "Щракнете, за да сортирате в низходящ ред", - sortingState: "${0} - ${1}", - unsorted: "Не сортирайте тази колона", - indirectSelectionRadio: "Ред ${0}, единичен избор, радио кутия", - indirectSelectionCheckBox: "Ред ${0}, множествен избор, поле за отметка", - selectAll: "Избери всички" -}) -); +define( +"dojox/grid/enhanced/nls/bg/EnhancedGrid", ({ + singleSort: "Единично сортиране", + nestedSort: "Вградено сортиране", + ascending: "Щракнете, за да сортирате във възходящ ред", + descending: "Щракнете, за да сортирате в низходящ ред", + sortingState: "${0} - ${1}", + unsorted: "Не сортирайте тази колона", + indirectSelectionRadio: "Ред ${0}, единичен избор, радио кутия", + indirectSelectionCheckBox: "Ред ${0}, множествен избор, поле за отметка", + selectAll: "Избери всички" +}) +); diff --git a/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Filter.js.uncompressed.js b/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Filter.js.uncompressed.js index b31753b6ef..f22f944c02 100644 --- a/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Filter.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Filter.js.uncompressed.js @@ -1,75 +1,75 @@ -define( -"dojox/grid/enhanced/nls/bg/Filter", ({ - "clearFilterDialogTitle": "Изчисти филтър", - "filterDefDialogTitle": "Филтър", - "ruleTitleTemplate": "Правило ${0}", - "conditionEqual": "равен", - "conditionNotEqual": "не е равен", - "conditionLess": "по-малък от", - "conditionLessEqual": "по-малък от или равен", - "conditionLarger": "по-голям от", - "conditionLargerEqual": "по-голям от или равен", - "conditionContains": "съдържа", - "conditionIs": "е", - "conditionStartsWith": "започва с", - "conditionEndWith": "завършва с", - "conditionNotContain": "не съдържа", - "conditionIsNot": "не е", - "conditionNotStartWith": "не започва с", - "conditionNotEndWith": "не завършва с", - "conditionBefore": "преди", - "conditionAfter": "след", - "conditionRange": "обхват", - "conditionIsEmpty": "празен", - "all": "всички", - "any": "който и да било", - "relationAll": "всички правила", - "waiRelAll": "Комбинирай всички следни правила:", - "relationAny": "които и да било правила", - "waiRelAny": "Комбинирай които и да било от следните правила:", - "relationMsgFront": "Комбинирай:", - "relationMsgTail": "", - "and": "и", - "or": "или", - "addRuleButton": "Добави правило", - "waiAddRuleButton": "Добави ново правило", - "removeRuleButton": "Премахни правило", - "waiRemoveRuleButtonTemplate": "Премахни правило ${0}", - "cancelButton": "Отмени", - "waiCancelButton": "Отмени този диалог", - "clearButton": "Изчисти", - "waiClearButton": "Изчисти филтъра", - "filterButton": "Филтър", - "waiFilterButton": "Подай филтър", - "columnSelectLabel": "Колона", - "waiColumnSelectTemplate": "Колона за правило ${0}", - "conditionSelectLabel": "Условие", - "waiConditionSelectTemplate": "Условие за правило ${0}", - "valueBoxLabel": "Стойност", - "waiValueBoxTemplate": "Въведи стойност за филтриране на правило ${0}", - "rangeTo": "до", - "rangeTemplate": "от ${0} до ${1}", - "statusTipHeaderColumn": "Колона", - "statusTipHeaderCondition": "Правила", - "statusTipTitle": "Лента с филтри", - "statusTipMsg": "Щракнете върху лентата с филтри тук, за да филтрирате стойностите в ${0}.", - "anycolumn": "която и да било колона", - "statusTipTitleNoFilter": "Лента с филтри", - "statusTipTitleHasFilter": "Филтър", - "statusTipRelAny": "Комбинирай които и да било правила.", - "statusTipRelAll": "Комбинирай всички правила.", - "defaultItemsName": "елементи", - "filterBarMsgHasFilterTemplate": "Показани ${0} от ${1} ${2}.", - "filterBarMsgNoFilterTemplate": "Не е приложен филтър", - "filterBarDefButton": "Определи филтър", - "waiFilterBarDefButton": "Филтрирай таблицата", - "a11yFilterBarDefButton": "Филтър...", - "filterBarClearButton": "Изчисти филтър", - "waiFilterBarClearButton": "Изчисти филтъра", - "closeFilterBarBtn": "Затвори лентата с филтри", - "clearFilterMsg": "Това ще премахне филтъра и ще покаже всички налични записи.", - "anyColumnOption": "Която и да било колона", - "trueLabel": "Вярно", - "falseLabel": "Невярно" -}) -); +define( +"dojox/grid/enhanced/nls/bg/Filter", ({ + "clearFilterDialogTitle": "Изчисти филтър", + "filterDefDialogTitle": "Филтър", + "ruleTitleTemplate": "Правило ${0}", + "conditionEqual": "равен", + "conditionNotEqual": "не е равен", + "conditionLess": "по-малък от", + "conditionLessEqual": "по-малък от или равен", + "conditionLarger": "по-голям от", + "conditionLargerEqual": "по-голям от или равен", + "conditionContains": "съдържа", + "conditionIs": "е", + "conditionStartsWith": "започва с", + "conditionEndWith": "завършва с", + "conditionNotContain": "не съдържа", + "conditionIsNot": "не е", + "conditionNotStartWith": "не започва с", + "conditionNotEndWith": "не завършва с", + "conditionBefore": "преди", + "conditionAfter": "след", + "conditionRange": "обхват", + "conditionIsEmpty": "празен", + "all": "всички", + "any": "който и да било", + "relationAll": "всички правила", + "waiRelAll": "Комбинирай всички следни правила:", + "relationAny": "които и да било правила", + "waiRelAny": "Комбинирай които и да било от следните правила:", + "relationMsgFront": "Комбинирай:", + "relationMsgTail": "", + "and": "и", + "or": "или", + "addRuleButton": "Добави правило", + "waiAddRuleButton": "Добави ново правило", + "removeRuleButton": "Премахни правило", + "waiRemoveRuleButtonTemplate": "Премахни правило ${0}", + "cancelButton": "Отмени", + "waiCancelButton": "Отмени този диалог", + "clearButton": "Изчисти", + "waiClearButton": "Изчисти филтъра", + "filterButton": "Филтър", + "waiFilterButton": "Подай филтър", + "columnSelectLabel": "Колона", + "waiColumnSelectTemplate": "Колона за правило ${0}", + "conditionSelectLabel": "Условие", + "waiConditionSelectTemplate": "Условие за правило ${0}", + "valueBoxLabel": "Стойност", + "waiValueBoxTemplate": "Въведи стойност за филтриране на правило ${0}", + "rangeTo": "до", + "rangeTemplate": "от ${0} до ${1}", + "statusTipHeaderColumn": "Колона", + "statusTipHeaderCondition": "Правила", + "statusTipTitle": "Лента с филтри", + "statusTipMsg": "Щракнете върху лентата с филтри тук, за да филтрирате стойностите в ${0}.", + "anycolumn": "която и да било колона", + "statusTipTitleNoFilter": "Лента с филтри", + "statusTipTitleHasFilter": "Филтър", + "statusTipRelAny": "Комбинирай които и да било правила.", + "statusTipRelAll": "Комбинирай всички правила.", + "defaultItemsName": "елементи", + "filterBarMsgHasFilterTemplate": "Показани ${0} от ${1} ${2}.", + "filterBarMsgNoFilterTemplate": "Не е приложен филтър", + "filterBarDefButton": "Определи филтър", + "waiFilterBarDefButton": "Филтрирай таблицата", + "a11yFilterBarDefButton": "Филтър...", + "filterBarClearButton": "Изчисти филтър", + "waiFilterBarClearButton": "Изчисти филтъра", + "closeFilterBarBtn": "Затвори лентата с филтри", + "clearFilterMsg": "Това ще премахне филтъра и ще покаже всички налични записи.", + "anyColumnOption": "Която и да било колона", + "trueLabel": "Вярно", + "falseLabel": "Невярно" +}) +); diff --git a/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Pagination.js.uncompressed.js b/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Pagination.js.uncompressed.js index 57300745cf..0ab40d7861 100644 --- a/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Pagination.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/grid/enhanced/nls/bg/Pagination.js.uncompressed.js @@ -1,21 +1,21 @@ -define( -"dojox/grid/enhanced/nls/bg/Pagination", ({ - "descTemplate": "${2} - ${3} от ${1} ${0}", - "firstTip": "Първа страница", - "lastTip": "Последна страница", - "nextTip": "Следваща страница", - "prevTip": "Предишна страница", - "itemTitle": "елементи", - "singularItemTitle": "елемент", - "pageStepLabelTemplate": "Страница ${0}", - "pageSizeLabelTemplate": "${0} елементи на страница", - "allItemsLabelTemplate": "Всички елементи", - "gotoButtonTitle": "Отиди до конкретна страница", - "dialogTitle": "Отиди до страница", - "dialogIndication": "Укажи номер на страница", - "pageCountIndication": " (${0} страници)", - "dialogConfirm": "Отиди", - "dialogCancel": "Отмени", - "all": "Всички" -}) -); +define( +"dojox/grid/enhanced/nls/bg/Pagination", ({ + "descTemplate": "${2} - ${3} от ${1} ${0}", + "firstTip": "Първа страница", + "lastTip": "Последна страница", + "nextTip": "Следваща страница", + "prevTip": "Предишна страница", + "itemTitle": "елементи", + "singularItemTitle": "елемент", + "pageStepLabelTemplate": "Страница ${0}", + "pageSizeLabelTemplate": "${0} елементи на страница", + "allItemsLabelTemplate": "Всички елементи", + "gotoButtonTitle": "Отиди до конкретна страница", + "dialogTitle": "Отиди до страница", + "dialogIndication": "Укажи номер на страница", + "pageCountIndication": " (${0} страници)", + "dialogConfirm": "Отиди", + "dialogCancel": "Отмени", + "all": "Всички" +}) +); diff --git a/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/EnhancedGrid.js.uncompressed.js b/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/EnhancedGrid.js.uncompressed.js index ffef3224f7..1b2a2bf955 100644 --- a/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/EnhancedGrid.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/EnhancedGrid.js.uncompressed.js @@ -1,13 +1,13 @@ -define( -"dojox/grid/enhanced/nls/uk/EnhancedGrid", ({ - singleSort: "Однорівневе сортування", - nestedSort: "Вкладене сортування", - ascending: "Клацніть для сортування за зростанням", - descending: "Клацніть для сортування за спаданням", - sortingState: "${0} - ${1}", - unsorted: "Не сортувати цей стовпець", - indirectSelectionRadio: "Рядок ${0}, однорівневе сортування, перемикач", - indirectSelectionCheckBox: "Рядок ${0}, багаторівневе сортування, перемикач", - selectAll: "Виділити все" -}) -); +define( +"dojox/grid/enhanced/nls/uk/EnhancedGrid", ({ + singleSort: "Однорівневе сортування", + nestedSort: "Вкладене сортування", + ascending: "Клацніть для сортування за зростанням", + descending: "Клацніть для сортування за спаданням", + sortingState: "${0} - ${1}", + unsorted: "Не сортувати цей стовпець", + indirectSelectionRadio: "Рядок ${0}, однорівневе сортування, перемикач", + indirectSelectionCheckBox: "Рядок ${0}, багаторівневе сортування, перемикач", + selectAll: "Виділити все" +}) +); diff --git a/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Filter.js.uncompressed.js b/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Filter.js.uncompressed.js index 2c7e449613..69571502d1 100644 --- a/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Filter.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Filter.js.uncompressed.js @@ -1,75 +1,75 @@ -define( -"dojox/grid/enhanced/nls/uk/Filter", ({ - "clearFilterDialogTitle": "Очистити фільтр", - "filterDefDialogTitle": "Фільтр", - "ruleTitleTemplate": "Правило ${0}", - "conditionEqual": "дорівнює", - "conditionNotEqual": "не дорівнює", - "conditionLess": "менше за", - "conditionLessEqual": "менше або дорівнює", - "conditionLarger": "більше за", - "conditionLargerEqual": "більше або дорівнює", - "conditionContains": "містить", - "conditionIs": "дорівнює", - "conditionStartsWith": "починається з", - "conditionEndWith": "закінчується на", - "conditionNotContain": "не містить", - "conditionIsNot": "не дорівнює", - "conditionNotStartWith": "не починається з", - "conditionNotEndWith": "не закінчується на", - "conditionBefore": "до", - "conditionAfter": "після", - "conditionRange": "діапазон", - "conditionIsEmpty": "порожній", - "all": "всі", - "any": "будь-яке", - "relationAll": "всі правила", - "waiRelAll": "Відповідає всім наступним правилам:", - "relationAny": "будь-які правила", - "waiRelAny": "Відповідає будь-якому з наступних правил:", - "relationMsgFront": "Відповідає:", - "relationMsgTail": "", - "and": "та", - "or": "або", - "addRuleButton": "Додати правило", - "waiAddRuleButton": "Додати нове правило", - "removeRuleButton": "Видалити правило", - "waiRemoveRuleButtonTemplate": "Видалити правило ${0}", - "cancelButton": "Скасувати", - "waiCancelButton": "Скасувати це вікно", - "clearButton": "Очистити", - "waiClearButton": "Очистити фільтр", - "filterButton": "Фільтр", - "waiFilterButton": "Застосувати фільтр", - "columnSelectLabel": "Стовпчик", - "waiColumnSelectTemplate": "Стовпчик для правила ${0}", - "conditionSelectLabel": "Умова", - "waiConditionSelectTemplate": "Умова правила ${0}", - "valueBoxLabel": "Значення", - "waiValueBoxTemplate": "Введіть значення до фільтру правила ${0}", - "rangeTo": "до", - "rangeTemplate": "з ${0} до ${1}", - "statusTipHeaderColumn": "Стовпчик", - "statusTipHeaderCondition": "Правила", - "statusTipTitle": "Панель фільтрів", - "statusTipMsg": "Клацніть на панелі фільтрів для фільтрації за значеннями в ${0}.", - "anycolumn": "будь-який стовпець", - "statusTipTitleNoFilter": "Панель фільтрів", - "statusTipTitleHasFilter": "Фільтр", - "statusTipRelAny": "Відповідає будь-якому з правил.", - "statusTipRelAll": "Відповідає всім правилам.", - "defaultItemsName": "елементи", - "filterBarMsgHasFilterTemplate": "Показано ${0} з ${1} ${2}.", - "filterBarMsgNoFilterTemplate": "Фільтри не використовуються", - "filterBarDefButton": "Визначити фільтр", - "waiFilterBarDefButton": "Фільтрувати таблицю", - "a11yFilterBarDefButton": "Фільтр...", - "filterBarClearButton": "Очистити фільтр", - "waiFilterBarClearButton": "Очистити фільтр", - "closeFilterBarBtn": "Закрити панель фільтрів", - "clearFilterMsg": "Ця опція видаляє фільтр та показує всі доступні записи.", - "anyColumnOption": "Будь-який стовпець", - "trueLabel": "Істина", - "falseLabel": "Неправда" -}) -); +define( +"dojox/grid/enhanced/nls/uk/Filter", ({ + "clearFilterDialogTitle": "Очистити фільтр", + "filterDefDialogTitle": "Фільтр", + "ruleTitleTemplate": "Правило ${0}", + "conditionEqual": "дорівнює", + "conditionNotEqual": "не дорівнює", + "conditionLess": "менше за", + "conditionLessEqual": "менше або дорівнює", + "conditionLarger": "більше за", + "conditionLargerEqual": "більше або дорівнює", + "conditionContains": "містить", + "conditionIs": "дорівнює", + "conditionStartsWith": "починається з", + "conditionEndWith": "закінчується на", + "conditionNotContain": "не містить", + "conditionIsNot": "не дорівнює", + "conditionNotStartWith": "не починається з", + "conditionNotEndWith": "не закінчується на", + "conditionBefore": "до", + "conditionAfter": "після", + "conditionRange": "діапазон", + "conditionIsEmpty": "порожній", + "all": "всі", + "any": "будь-яке", + "relationAll": "всі правила", + "waiRelAll": "Відповідає всім наступним правилам:", + "relationAny": "будь-які правила", + "waiRelAny": "Відповідає будь-якому з наступних правил:", + "relationMsgFront": "Відповідає:", + "relationMsgTail": "", + "and": "та", + "or": "або", + "addRuleButton": "Додати правило", + "waiAddRuleButton": "Додати нове правило", + "removeRuleButton": "Видалити правило", + "waiRemoveRuleButtonTemplate": "Видалити правило ${0}", + "cancelButton": "Скасувати", + "waiCancelButton": "Скасувати це вікно", + "clearButton": "Очистити", + "waiClearButton": "Очистити фільтр", + "filterButton": "Фільтр", + "waiFilterButton": "Застосувати фільтр", + "columnSelectLabel": "Стовпчик", + "waiColumnSelectTemplate": "Стовпчик для правила ${0}", + "conditionSelectLabel": "Умова", + "waiConditionSelectTemplate": "Умова правила ${0}", + "valueBoxLabel": "Значення", + "waiValueBoxTemplate": "Введіть значення до фільтру правила ${0}", + "rangeTo": "до", + "rangeTemplate": "з ${0} до ${1}", + "statusTipHeaderColumn": "Стовпчик", + "statusTipHeaderCondition": "Правила", + "statusTipTitle": "Панель фільтрів", + "statusTipMsg": "Клацніть на панелі фільтрів для фільтрації за значеннями в ${0}.", + "anycolumn": "будь-який стовпець", + "statusTipTitleNoFilter": "Панель фільтрів", + "statusTipTitleHasFilter": "Фільтр", + "statusTipRelAny": "Відповідає будь-якому з правил.", + "statusTipRelAll": "Відповідає всім правилам.", + "defaultItemsName": "елементи", + "filterBarMsgHasFilterTemplate": "Показано ${0} з ${1} ${2}.", + "filterBarMsgNoFilterTemplate": "Фільтри не використовуються", + "filterBarDefButton": "Визначити фільтр", + "waiFilterBarDefButton": "Фільтрувати таблицю", + "a11yFilterBarDefButton": "Фільтр...", + "filterBarClearButton": "Очистити фільтр", + "waiFilterBarClearButton": "Очистити фільтр", + "closeFilterBarBtn": "Закрити панель фільтрів", + "clearFilterMsg": "Ця опція видаляє фільтр та показує всі доступні записи.", + "anyColumnOption": "Будь-який стовпець", + "trueLabel": "Істина", + "falseLabel": "Неправда" +}) +); diff --git a/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Pagination.js.uncompressed.js b/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Pagination.js.uncompressed.js index 731bc7c24d..4100cc98de 100644 --- a/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Pagination.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/grid/enhanced/nls/uk/Pagination.js.uncompressed.js @@ -1,21 +1,21 @@ -define( -"dojox/grid/enhanced/nls/uk/Pagination", ({ - "descTemplate": "${2} - ${3} з ${1} ${0}", - "firstTip": "Перша сторінка", - "lastTip": "Остання сторінка", - "nextTip": "Наступна сторінка", - "prevTip": "Попередня сторінка", - "itemTitle": "елементи", - "singularItemTitle": "елемент", - "pageStepLabelTemplate": "Сторінка ${0}", - "pageSizeLabelTemplate": "${0} елементів на сторінці", - "allItemsLabelTemplate": "Усі елементи", - "gotoButtonTitle": "Перейти до вказаної сторінки", - "dialogTitle": "Перейти до сторінки", - "dialogIndication": "Вкажіть номер сторінки", - "pageCountIndication": " (${0} сторінок)", - "dialogConfirm": "Перейти", - "dialogCancel": "Скасувати", - "all": "Всі" -}) -); +define( +"dojox/grid/enhanced/nls/uk/Pagination", ({ + "descTemplate": "${2} - ${3} з ${1} ${0}", + "firstTip": "Перша сторінка", + "lastTip": "Остання сторінка", + "nextTip": "Наступна сторінка", + "prevTip": "Попередня сторінка", + "itemTitle": "елементи", + "singularItemTitle": "елемент", + "pageStepLabelTemplate": "Сторінка ${0}", + "pageSizeLabelTemplate": "${0} елементів на сторінці", + "allItemsLabelTemplate": "Усі елементи", + "gotoButtonTitle": "Перейти до вказаної сторінки", + "dialogTitle": "Перейти до сторінки", + "dialogIndication": "Вкажіть номер сторінки", + "pageCountIndication": " (${0} сторінок)", + "dialogConfirm": "Перейти", + "dialogCancel": "Скасувати", + "all": "Всі" +}) +); diff --git a/Core/dojo-build/dist/dojox/widget/nls/bg/ColorPicker.js.uncompressed.js b/Core/dojo-build/dist/dojox/widget/nls/bg/ColorPicker.js.uncompressed.js index db9f34f890..fe729abb2e 100644 --- a/Core/dojo-build/dist/dojox/widget/nls/bg/ColorPicker.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/widget/nls/bg/ColorPicker.js.uncompressed.js @@ -1,14 +1,14 @@ -define( -"dojox/widget/nls/bg/ColorPicker", ({ - redLabel: "r", - greenLabel: "g", - blueLabel: "b", - hueLabel: "h", - saturationLabel: "s", - valueLabel: "v", /* aka intensity or brightness */ - degLabel: "\u00B0", - hexLabel: "шестнадесетичен", - huePickerTitle: "Селектро на нюанси", - saturationPickerTitle: "Селектор на наситеност" -}) -); +define( +"dojox/widget/nls/bg/ColorPicker", ({ + redLabel: "r", + greenLabel: "g", + blueLabel: "b", + hueLabel: "h", + saturationLabel: "s", + valueLabel: "v", /* aka intensity or brightness */ + degLabel: "\u00B0", + hexLabel: "шестнадесетичен", + huePickerTitle: "Селектро на нюанси", + saturationPickerTitle: "Селектор на наситеност" +}) +); diff --git a/Core/dojo-build/dist/dojox/widget/nls/bg/FilePicker.js.uncompressed.js b/Core/dojo-build/dist/dojox/widget/nls/bg/FilePicker.js.uncompressed.js index 9979c7c3bb..ac15418b2d 100644 --- a/Core/dojo-build/dist/dojox/widget/nls/bg/FilePicker.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/widget/nls/bg/FilePicker.js.uncompressed.js @@ -1,7 +1,7 @@ -define( -"dojox/widget/nls/bg/FilePicker", ({ - name: "Име", - path: "Пътека", - size: "Размер (в байтове)" -}) -); +define( +"dojox/widget/nls/bg/FilePicker", ({ + name: "Име", + path: "Пътека", + size: "Размер (в байтове)" +}) +); diff --git a/Core/dojo-build/dist/dojox/widget/nls/bg/Wizard.js.uncompressed.js b/Core/dojo-build/dist/dojox/widget/nls/bg/Wizard.js.uncompressed.js index 3d30d8bf6d..c145b09d24 100644 --- a/Core/dojo-build/dist/dojox/widget/nls/bg/Wizard.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/widget/nls/bg/Wizard.js.uncompressed.js @@ -1,7 +1,7 @@ -define( -"dojox/widget/nls/bg/Wizard", ({ - next: "Следващ", - previous: "Предишен", - done: "Готово" -}) -); +define( +"dojox/widget/nls/bg/Wizard", ({ + next: "Следващ", + previous: "Предишен", + done: "Готово" +}) +); diff --git a/Core/dojo-build/dist/dojox/widget/nls/uk/ColorPicker.js.uncompressed.js b/Core/dojo-build/dist/dojox/widget/nls/uk/ColorPicker.js.uncompressed.js index 88a810681f..0dde5e9a5d 100644 --- a/Core/dojo-build/dist/dojox/widget/nls/uk/ColorPicker.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/widget/nls/uk/ColorPicker.js.uncompressed.js @@ -1,14 +1,14 @@ -define( -"dojox/widget/nls/uk/ColorPicker", ({ - redLabel: "r", - greenLabel: "g", - blueLabel: "b", - hueLabel: "h", - saturationLabel: "s", - valueLabel: "v", /* aka intensity or brightness */ - degLabel: "\u00B0", - hexLabel: "hex", - huePickerTitle: "Відтінок", - saturationPickerTitle: "Насиченість" -}) -); +define( +"dojox/widget/nls/uk/ColorPicker", ({ + redLabel: "r", + greenLabel: "g", + blueLabel: "b", + hueLabel: "h", + saturationLabel: "s", + valueLabel: "v", /* aka intensity or brightness */ + degLabel: "\u00B0", + hexLabel: "hex", + huePickerTitle: "Відтінок", + saturationPickerTitle: "Насиченість" +}) +); diff --git a/Core/dojo-build/dist/dojox/widget/nls/uk/FilePicker.js.uncompressed.js b/Core/dojo-build/dist/dojox/widget/nls/uk/FilePicker.js.uncompressed.js index 1aac019923..325fee277b 100644 --- a/Core/dojo-build/dist/dojox/widget/nls/uk/FilePicker.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/widget/nls/uk/FilePicker.js.uncompressed.js @@ -1,7 +1,7 @@ -define( -"dojox/widget/nls/uk/FilePicker", ({ - name: "Ім'я", - path: "Шлях", - size: "Розмір (у байтах)" -}) -); +define( +"dojox/widget/nls/uk/FilePicker", ({ + name: "Ім'я", + path: "Шлях", + size: "Розмір (у байтах)" +}) +); diff --git a/Core/dojo-build/dist/dojox/widget/nls/uk/Wizard.js.uncompressed.js b/Core/dojo-build/dist/dojox/widget/nls/uk/Wizard.js.uncompressed.js index 976f366f35..2ce4296ea7 100644 --- a/Core/dojo-build/dist/dojox/widget/nls/uk/Wizard.js.uncompressed.js +++ b/Core/dojo-build/dist/dojox/widget/nls/uk/Wizard.js.uncompressed.js @@ -1,7 +1,7 @@ -define( -"dojox/widget/nls/uk/Wizard", ({ - next: "Далі", - previous: "Назад", - done: "Готово" -}) -); +define( +"dojox/widget/nls/uk/Wizard", ({ + next: "Далі", + previous: "Назад", + done: "Готово" +}) +); diff --git a/Core/dojo-build/dist/xstyle/main.js.uncompressed.js b/Core/dojo-build/dist/xstyle/main.js.uncompressed.js index 946b31f4d3..3e9a0325b1 100644 --- a/Core/dojo-build/dist/xstyle/main.js.uncompressed.js +++ b/Core/dojo-build/dist/xstyle/main.js.uncompressed.js @@ -1,117 +1,117 @@ -define("xstyle/main", ["require", "xstyle/core/parser", "xstyle/core/base", "xstyle/core/elemental"], function (require, parser, ruleModel, elemental) { - "use strict"; - function search(tag){ - // used to search for link and style tags - var elements = document.getElementsByTagName(tag); - for(var i = 0; i < elements.length; i++){ - checkImports(elements[i]); - } - } - elemental.ready(function(){ - // search the document for and + + + + + + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+ + +
\ No newline at end of file diff --git a/Core/web/WEB-INF/jsp/shutdown.jsp b/Core/web/WEB-INF/jsp/shutdown.jsp index 30fd4e29e0..c78419367d 100644 --- a/Core/web/WEB-INF/jsp/shutdown.jsp +++ b/Core/web/WEB-INF/jsp/shutdown.jsp @@ -1,118 +1,127 @@ -<%-- - Copyright (C) 2014 Infinite Automation Software. All rights reserved. - @author Terry Packer ---%> -<%@ include file="/WEB-INF/jsp/include/tech.jsp" %> - - - - - - -
-
-
-
-
-
-
+<%-- + Copyright (C) 2014 Infinite Automation Software. All rights reserved. + @author Terry Packer +--%> +<%@ include file="/WEB-INF/jsp/include/tech.jsp" %> + + + + + +
+
+
+
+
+
+ + +
diff --git a/Core/web/WEB-INF/jsp/starting.jsp b/Core/web/WEB-INF/jsp/starting.jsp index ae05de73b1..978f6d5c80 100644 --- a/Core/web/WEB-INF/jsp/starting.jsp +++ b/Core/web/WEB-INF/jsp/starting.jsp @@ -1,122 +1,24 @@ -<%-- - Copyright (C) 2014 Infinite Automation Software. All rights reserved. - @author Terry Packer ---%> -<%@ include file="/WEB-INF/jsp/include/tech.jsp" %> - - - - - - -
-
-
-
-
-
-
+<%-- + Copyright (C) 2014 Infinite Automation Software. All rights reserved. + @author Terry Packer +--%> +<%@ include file="/WEB-INF/jsp/include/tech.jsp" %> + + + + + + + +
+
+
+
+
+
+ +
diff --git a/Core/web/WEB-INF/jsp/systemSettings.jsp b/Core/web/WEB-INF/jsp/systemSettings.jsp index 46b0295d37..aadc29c88c 100644 --- a/Core/web/WEB-INF/jsp/systemSettings.jsp +++ b/Core/web/WEB-INF/jsp/systemSettings.jsp @@ -124,6 +124,19 @@ $set("", settings.); $set("", settings.); $set("", settings.); + + $set("", settings.); + + $set("", settings.); + $set("", settings.); + $set("", settings.); + $set("", settings.); + $set("", settings.); + $set("", settings.); + $set("", settings.); + $set("", settings.); + + }); @@ -433,6 +446,99 @@ setUserMessage("backupSettingsMessage", ""); } + /** + * Save the Chart Settings + */ + function saveChartSettings() { + hideContextualMessages("chartSettingsTab"); //Clear out any existing msgs + SystemSettingsDwr.saveChartSettings( + $get(""), + function(response) { + setDisabled("saveChartSettingsBtn", false); + if (response.hasMessages) + showDwrMessages(response.messages); + else + setUserMessage("chartSettingsMessage", ""); + }); + setUserMessage("chartSettingsMessage"); + setDisabled("saveChartSettingsBtn", true); + } + + /** + * Save the Backup Settings + */ + function saveDatabaseBackupSettings() { + hideContextualMessages("databaseBackupSettingsTab"); //Clear out any existing msgs + SystemSettingsDwr.saveDatabaseBackupSettings( + $get(""), + $get(""), + $get(""), + $get(""), + $get(""), + $get(""), + $get(""), + function(response) { + setDisabled("saveDatabaseBackupSettingsBtn", false); + if (response.hasMessages) + showDwrMessages(response.messages); + else + setUserMessage("databaseBackupSettingsMessage", ""); + }); + setUserMessage("databaseBackupSettingsMessage"); + setDisabled("saveDatabaseBackupSettingsBtn", true); + } + + function backupDatabaseNow(){ + SystemSettingsDwr.queueDatabaseBackup() + setUserMessage("databaseBackupSettingsMessage", ""); + } + /* + * Save the Backup Settings + */ + function getDatabaseBackupFiles() { + hideContextualMessages("databaseBackupSettingsTab"); //Clear out any existing msgs + SystemSettingsDwr.getDatabaseBackupFiles(function(response){ + var backupFileSelect = document.getElementById("databaseFileToRestore"); + while(backupFileSelect.length > 0) + backupFileSelect.remove(0); + for(var x=0; x")) + return; + + var restoreMessages = document.getElementById("databaseRestoreMessages"); + restoreMessages.innerHTML = ""; //Clear out messages + var backupFileSelect = document.getElementById("databaseFileToRestore"); + var selectedFile = backupFileSelect.options[backupFileSelect.selectedIndex]; + if(typeof selectedFile == 'undefined'){ + alert(""); + return; + } + + + SystemSettingsDwr.restoreDatabaseFromBackup(selectedFile.value, function(response){ + if (response.hasMessages) + showDwrMessages(response.messages, $("databaseRestoreMessages")); + else + setUserMessage("databaseBackupSettingsMessage", ""); + + }); + + } + @@ -802,7 +908,7 @@ - + @@ -853,7 +959,92 @@
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ "/>" type="checkbox" /> +
"/>">
"/>"/>
+ "/>" type="text" class="formShort"/> + + +
+ "/>" type="text" class="formShort"/>: + "/>" type="text" class="formShort"/> +
+ "/>" type="text" class="formShort"/> +
+ + + " onclick="getDatabaseBackupFiles()"/> + " onclick="restoreDatabaseFromBackup()"/> +
+ " onclick="backupDatabaseNow()"/> + " onclick="saveDatabaseBackupSettings()"/> + +
+ + +
+
+
+ + + + + + + + + + + + +
+ "/>" type="checkbox" /> +
+ " onclick="saveChartSettings()"/> + +
+
diff --git a/Core/web/WEB-INF/jsp/users.jsp b/Core/web/WEB-INF/jsp/users.jsp index 9311cdb2cc..f27ddc3f73 100644 --- a/Core/web/WEB-INF/jsp/users.jsp +++ b/Core/web/WEB-INF/jsp/users.jsp @@ -445,7 +445,6 @@ } -
- diff --git a/Core/web/WEB-INF/snippet/exportDialog.jsp b/Core/web/WEB-INF/snippet/exportDialog.jsp index 42280128f7..85c31dba5f 100644 --- a/Core/web/WEB-INF/snippet/exportDialog.jsp +++ b/Core/web/WEB-INF/snippet/exportDialog.jsp @@ -1,21 +1,21 @@ -<%-- - Copyright (C) 2013 Deltamation Software. All rights reserved. - @author Jared Wiltshire ---%> - -<%@ include file="/WEB-INF/jsp/include/tech.jsp" %> - - - -
" style="display: none"> -
-
- -
-
- -
-
-
+<%-- + Copyright (C) 2013 Deltamation Software. All rights reserved. + @author Jared Wiltshire +--%> + +<%@ include file="/WEB-INF/jsp/include/tech.jsp" %> + + + +
" style="display: none"> +
+
+ +
+
+ +
+
+
diff --git a/Core/web/WEB-INF/snippet/message.jsp b/Core/web/WEB-INF/snippet/message.jsp index 05a112e7ea..45c78de38e 100644 --- a/Core/web/WEB-INF/snippet/message.jsp +++ b/Core/web/WEB-INF/snippet/message.jsp @@ -107,6 +107,7 @@ String[] mangoMessageKeys = { "pointEdit.detectors.posCusum", "pointEdit.detectors.negCusum", "pointEdit.detectors.regexState", + "pointEdit.detectors.range", "pointEdit.logging.period", diff --git a/Core/web/WEB-INF/snippet/view/dataPoint/dataPointTable.jsp b/Core/web/WEB-INF/snippet/view/dataPoint/dataPointTable.jsp index e408d5f30a..a7c40e61b7 100644 --- a/Core/web/WEB-INF/snippet/view/dataPoint/dataPointTable.jsp +++ b/Core/web/WEB-INF/snippet/view/dataPoint/dataPointTable.jsp @@ -6,23 +6,15 @@
- -<%-- --%> -<%-- --%> - -<%-- --%> -<%-- --%> - - - - + + +
- +<%-- Include the Edit Div --%>
-<%-- --%> \ No newline at end of file diff --git a/Core/web/WEB-INF/snippet/view/dataPoint/eventDetectors.jsp b/Core/web/WEB-INF/snippet/view/dataPoint/eventDetectors.jsp index 84c2a47ed5..37c6156265 100644 --- a/Core/web/WEB-INF/snippet/view/dataPoint/eventDetectors.jsp +++ b/Core/web/WEB-INF/snippet/view/dataPoint/eventDetectors.jsp @@ -55,6 +55,15 @@