NIFI-13710: Rebuilding Update Attribute Custom UI. (#9561)

* NIFI-13710: Rebuilding Update Attribute Custom UI.

* NIFI-13710: Removing unnecessary codemirror import.

* NIFI-13710: Addressing review feedback.
- Adding editor hint so users know how to use EL.
- Fixing issue with rule payload when managing conditions and actions.
- Accounting for user permissions when setting the editable flag.
- Preventing editors from displaying offscreen.
- Showing snackbars following successfully saving.
- Adding validators to the condition and actions table.

* NIFI-13710: Addressing review feedback.
- Ensuring that the revision is saved after all actions.
- Ensuring that the evaluation criteria is reloaded when rules are added/removed.
- Updating additional details to reflect the new UI.

* NIFI-13710: Fixing text overflow issues.

* NIFI-13710: Applying text-base to the body.

* NIFI-13710: Addressing review feeback.
- Fixing imports.
- Disabling menu in tables when not editable.
- Fixing background color in dark mode.

* NIFI-13710: Requiring rules to be saved or discard once edited.

* NIFI-13710: Fixing import style which could result in circular imports.
- Fixing bug when evaluating open/closed rule when deciding if reordering should be allowed.

* NIFI-13710: Unpacking UI in prepare-package phase.
This commit is contained in:
Matt Gilman 2024-12-16 17:53:44 -05:00 committed by GitHub
parent 19bac11438
commit 794db3e1d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
339 changed files with 7184 additions and 9438 deletions

1
.gitignore vendored
View File

@ -10,6 +10,7 @@ nb-configuration.xml
# Intellij # Intellij
.idea/ .idea/
.run/
*.iml *.iml
*.iws *.iws
*.ipr *.ipr

View File

@ -440,163 +440,6 @@ For details see http://qtip2.com
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE. OTHER DEALINGS IN THE SOFTWARE.
This product bundles 'json2.js' which is available in the 'public domain'.
For details see https://github.com/douglascrockford/JSON-js
This product bundles 'reset.css' which is available in the 'public domain'.
For details see http://meyerweb.com/eric/tools/css/reset/
This product bundles 'Angular' which is available under an MIT license.
Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'Angular Material' which is available under an MIT license.
Copyright (c) 2014-2016 Google, Inc. http://angularjs.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'Angular Aria' which is available under an MIT license.
Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
This product bundles 'Angular Animate' which is available under an MIT license.
Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
This product bundles 'Angular Messages' which is available under an MIT license.
Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
This product bundles 'AngularUI Codemirror' which is available under an MIT license.
Copyright (c) 2012 the AngularUI Team, http://angular-ui.github.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'AngularUI Router' which is available under an MIT license.
Copyright (c) 2013-2015 The AngularUI Team, Karsten Sperling
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'Fontello' which is available under an MIT license. This product bundles 'Fontello' which is available under an MIT license.
Copyright (C) 2011 by Vitaly Puzrin Copyright (C) 2011 by Vitaly Puzrin
@ -619,29 +462,6 @@ This product bundles 'Fontello' which is available under an MIT license.
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
This product bundles HexViewJS available under an MIT License
Copyright (c) 2010 Nick McVeity <nmcveity@gmail.com>
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
The binary distribution of this product includes modules from Groovy which bundles ANTLR The binary distribution of this product includes modules from Groovy which bundles ANTLR
SOFTWARE RIGHTS SOFTWARE RIGHTS
@ -2872,4 +2692,7 @@ For the binary distribution of nifi-jolt-transform-json-ui see its 3rdpartylicen
for additional license and notice information. for additional license and notice information.
For the binary distribution of nifi-standard-content-viewer see its 3rdpartylicenses.txt For the binary distribution of nifi-standard-content-viewer see its 3rdpartylicenses.txt
for additional license and notice information.
For the binary distribution of nifi-update-attribute-ui see its 3rdpartylicenses.txt
for additional license and notice information. for additional license and notice information.

View File

@ -2581,4 +2581,7 @@ For the binary distribution of nifi-jolt-transform-json-ui see its 3rdpartylicen
for additional license and notice information. for additional license and notice information.
For the binary distribution of nifi-standard-content-viewer see its 3rdpartylicenses.txt For the binary distribution of nifi-standard-content-viewer see its 3rdpartylicenses.txt
for additional license and notice information.
For the binary distribution of nifi-update-attribute-ui see its 3rdpartylicenses.txt
for additional license and notice information. for additional license and notice information.

View File

@ -35,7 +35,7 @@
<url-pattern>/api/*</url-pattern> <url-pattern>/api/*</url-pattern>
</servlet-mapping> </servlet-mapping>
<!-- login filter --> <!-- fragment filter -->
<filter> <filter>
<filter-name>FragmentFilter</filter-name> <filter-name>FragmentFilter</filter-name>
<filter-class>org.apache.nifi.web.servlet.filter.QueryStringToFragmentFilter</filter-class> <filter-class>org.apache.nifi.web.servlet.filter.QueryStringToFragmentFilter</filter-class>

View File

@ -206,47 +206,7 @@ APACHE NIFI SUBCOMPONENTS:
The Apache NiFi project contains subcomponents with separate copyright The Apache NiFi project contains subcomponents with separate copyright
notices and license terms. Your use of the source code for the these notices and license terms. Your use of the source code for the these
subcomponents is subject to the terms and conditions of the following subcomponents is subject to the terms and conditions of the following
licenses. licenses.
This product bundles 'CodeMirror' which is available under an MIT style license. For the binary distribution of nifi-standard-content-viewer see its 3rdpartylicenses.txt
for additional license and notice information.
Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'JQuery' which is available under and MIT style license.
(c) 2005, 2014 jQuery Foundation, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -4,6 +4,9 @@ Copyright 2014-2024 The Apache Software Foundation
This product includes software developed at This product includes software developed at
The Apache Software Foundation (http://www.apache.org/). The Apache Software Foundation (http://www.apache.org/).
For the binary distribution of nifi-standard-content-viewer see its 3rdpartylicenses.txt
for additional license and notice information.
=========================================== ===========================================
Apache Software License v2 Apache Software License v2
=========================================== ===========================================

View File

@ -79,20 +79,18 @@ The preceding examples illustrate how to make changes to every FlowFile that goe
UpdateAttribute processor may also be used to make conditional changes. UpdateAttribute processor may also be used to make conditional changes.
To change attributes based on some condition, use the Advanced User Interface (UI) in the processor by clicking the * To change attributes based on some condition, use the Advanced User Interface (UI) in the processor by clicking the *
*Advanced** button in the lower right corner. *Advanced** menu item in the Canvas context menu.
Clicking the Advanced button displays the Advanced UI. In the Advanced UI, Conditions and their associated Actions are Clicking the Advanced menu item displays the Advanced UI. In the Advanced UI, Conditions and their associated Actions are
entered as "Rules". Each rule basically says, "If these conditions are met, then do this action." One or more conditions entered as "Rules". Each rule basically says, "If these conditions are met, then do this action." One or more conditions
may be used in a given rule, and they all must be met in order for the designated action(s) to be taken. may be used in a given rule, and they all must be met in order for the designated action(s) to be taken.
**Adding Rules** **Adding Rules**
To add rules and their associated conditions and actions, click on the buttons with the plus symbol located to the right To add the first rule, click on the "Create Rule" button in center of the screen. The Edit Rule form will display where
of the "Rules", "Conditions", and "Actions" labels. the name, comments, conditions, and actions for the rule can be entered. Once the rule is defined, click the **Add**
button. Additional rules can be added by clicking the button with the plus symbol located to the top right of the
Upon adding a rule with its condition(s) and action(s), it is important to save it by clicking the **Save** button in Rule listing.
the lower right corner. If you do not do so and attempt to add or navigate to another rule, an error message will
appear, asking you if you want to save your changes.
**Example Rules** **Example Rules**
@ -116,9 +114,9 @@ Taken together, this rule says:
**Adding another Rule** **Adding another Rule**
Continuing with this example, we can add another rule to check for files that are larger than one gigabyte. When we add Continuing with this example, we can add another rule to check for files that are larger than one gigabyte. When we add
this second rule, we can use the previous rule as a template, so to speak, by taking advantage of the "Copy from this second rule, we can use the previous rule as a template, so to speak, by taking advantage of the "Clone Rule" option
existing rule" option in the New Rule window. Simply start typing the name of an existing rule, and it will show up in a in the menu for the Rule that you wan to clone. This will open with new Rule form with the exisitng Rules criteria
dropdown menu below the entry field. pre-populated.
In this example, the CheckForGiantFiles rule has these conditions: In this example, the CheckForGiantFiles rule has these conditions:
@ -159,8 +157,8 @@ The delete attributes function does not produce a Provenance Event if the **alte
**FlowFile Policy** **FlowFile Policy**
Another setting in the Advanced UI is the FlowFile Policy. It is located in the upper-left corner of the UI, and it Another setting in the Advanced UI is the FlowFile Policy. It is located in the upper-left corner of the UI, and it
defines the processor's behavior when multiple rules match. It may be changed using the dropdown menu. By default, the defines the processor's behavior when multiple rules match. It may be changed using the slide toggle. By default, the
FlowFile Policy is set to "use clone". FlowFile Policy is set to use a clone of the original FlowFile for each matching rule.
If the FlowFile policy is set to "use clone", and multiple rules match, then a copy of the incoming FlowFile is created, If the FlowFile policy is set to "use clone", and multiple rules match, then a copy of the incoming FlowFile is created,
such that the number of outgoing FlowFiles is equal to the number of rules that match. In other words, if two rules (A such that the number of outgoing FlowFiles is equal to the number of rules that match. In other words, if two rules (A
@ -172,7 +170,8 @@ If the FlowFile policy is set to "use original", then all matching rules are app
there is only one outgoing FlowFile with all the attribute changes applied. In this case, the order of the rules matters there is only one outgoing FlowFile with all the attribute changes applied. In this case, the order of the rules matters
and the action for each rule that matches will be applied in that order. If multiple rules contain actions that update and the action for each rule that matches will be applied in that order. If multiple rules contain actions that update
the same attribute, the action from the last matching rule will take precedence. Notably, you can drag and drop the the same attribute, the action from the last matching rule will take precedence. Notably, you can drag and drop the
rules into a certain order within the Rules list. rules into a certain order within the Rules list once the FlowFile Policy is set to "use original" and the user has
toggled the "Reorder rules" control. While in this reordering mode, other Rule modifications are not allowed.
**Filtering Rules** **Filtering Rules**
@ -182,7 +181,7 @@ in the name, condition, or action.
**Closing the Advanced UI** **Closing the Advanced UI**
Once all changes have been saved in the Advanced UI, the UI can be closed using the X in the top right corner. Once all changes have been saved in the Advanced UI, you can navigate back to the Canvas using the navigation at the top.
**Stateful Usage** **Stateful Usage**

View File

@ -23,128 +23,45 @@
<artifactId>nifi-update-attribute-ui</artifactId> <artifactId>nifi-update-attribute-ui</artifactId>
<packaging>war</packaging> <packaging>war</packaging>
<properties> <properties>
<frontend.dependency.configs>${basedir}/src/main/frontend</frontend.dependency.configs> <update-attribute.ui.working.dir>${project.build.directory}/update-attribute-ui-working-directory</update-attribute.ui.working.dir>
<frontend.working.dir>${project.build.directory}/frontend-working-directory</frontend.working.dir>
<frontend.assets>${project.build.directory}/${project.build.finalName}/assets</frontend.assets>
</properties> </properties>
<build> <build>
<plugins> <plugins>
<!--
Unpack the built update attribute front end application
-->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-dependency-plugin</artifactId>
<executions> <executions>
<execution> <execution>
<id>copy-client-side-deps</id> <id>unpack-update-attribute-ui</id>
<phase>prepare-package</phase> <phase>prepare-package</phase>
<goals> <goals>
<goal>copy-resources</goal> <goal>unpack-dependencies</goal>
</goals> </goals>
<configuration> <configuration>
<outputDirectory>${frontend.assets}</outputDirectory> <includeGroupIds>org.apache.nifi</includeGroupIds>
<resources> <includeArtifactIds>nifi-frontend</includeArtifactIds>
<resource> <excludeTransitive>true</excludeTransitive>
<directory>${frontend.working.dir}/node_modules</directory> <silent>false</silent>
<filtering>false</filtering> <outputDirectory>${update-attribute.ui.working.dir}</outputDirectory>
<includes> <includes>update-attribute/**/*</includes>
<!-- font awesome -->
<include>font-awesome/css/**/*</include>
<include>font-awesome/fonts/**/*</include>
<include>font-awesome/README.md</include>
<!-- jquery -->
<include>jquery/dist/jquery.min*</include>
<include>jquery/LICENSE.txt</include>
<!-- jquery ui -->
<include>jquery-ui-dist/jquery-ui.min.js</include>
<include>jquery-ui-dist/jquery-ui.min.css</include>
<include>jquery-ui-dist/images/**/*</include>
<include>jquery-ui-dist/LICENSE.txt</include>
<!-- reset.css -->
<include>reset.css/reset.css</include>
<include>reset.css/README.md</include>
<!-- qtip2 -->
<include>qtip2/dist/*.css</include>
<include>qtip2/dist/jquery.qtip.min*</include>
<include>qtip2/LICENSE</include>
<!-- JSON2 -->
<include>JSON2/json2.js</include>
<!-- slickgrid -->
<include>slickgrid/slick.core.js</include>
<include>slickgrid/slick.dataview.js</include>
<include>slickgrid/slick.editors.js</include>
<include>slickgrid/slick.formatters.js</include>
<include>slickgrid/slick.grid.js</include>
<include>slickgrid/plugins/slick.autotooltips.js</include>
<include>slickgrid/plugins/slick.cellrangedecorator.js</include>
<include>slickgrid/plugins/slick.cellrangeselector.js</include>
<include>slickgrid/plugins/slick.cellselectionmodel.js</include>
<include>slickgrid/plugins/slick.rowselectionmodel.js</include>
<include>slickgrid/lib/jquery.event.drag-2.3.0.js</include>
<include>slickgrid/slick.grid.css</include>
<include>slickgrid/images/collapse.gif</include>
<include>slickgrid/images/expand.gif</include>
<include>slickgrid/MIT-LICENSE.txt</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
<execution>
<id>copy-package-json</id>
<phase>generate-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${frontend.working.dir}</outputDirectory>
<resources>
<resource>
<directory>${frontend.dependency.configs}</directory>
<filtering>false</filtering>
<includes>
<include>package.json</include>
<include>package-lock.json</include>
</includes>
</resource>
</resources>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<!--
Include the Update Attribute UI and exclude the JAR dependency
-->
<plugin> <plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>${frontend.mvn.plugin.version}</version>
<configuration>
<installDirectory>${frontend.working.dir}</installDirectory>
</configuration>
<executions>
<execution>
<id>install-node-and-npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<nodeVersion>${node.version}</nodeVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run ci</arguments>
<workingDirectory>${frontend.working.dir}</workingDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId> <artifactId>maven-war-plugin</artifactId>
<configuration> <configuration>
<webResources> <webResources>
<resource>
<directory>${update-attribute.ui.working.dir}/update-attribute</directory>
<includes>**/*</includes>
</resource>
<resource> <resource>
<directory>src/main/webapp/META-INF</directory> <directory>src/main/webapp/META-INF</directory>
<targetPath>META-INF</targetPath> <targetPath>META-INF</targetPath>
@ -154,18 +71,7 @@
<filtering>true</filtering> <filtering>true</filtering>
</resource> </resource>
</webResources> </webResources>
</configuration> <packagingExcludes>WEB-INF/lib/nifi-frontend*.jar</packagingExcludes>
</plugin>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
<configuration>
<excludes combine.children="append">
<exclude>src/main/frontend/package.json</exclude>
<exclude>src/main/frontend/package-lock.json</exclude>
<exclude>src/main/webapp/js/codemirror/</exclude>
<exclude>src/main/webapp/fonts/**/*</exclude>
</excludes>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
@ -177,7 +83,6 @@
<version>2.1.0-SNAPSHOT</version> <version>2.1.0-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.nifi</groupId> <groupId>org.apache.nifi</groupId>
<artifactId>nifi-framework-api</artifactId> <artifactId>nifi-framework-api</artifactId>
@ -233,5 +138,15 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-web-servlet-shared</artifactId>
<version>2.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-frontend</artifactId>
<version>2.1.0-SNAPSHOT</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,96 +0,0 @@
{
"name": "apache-nifi-update-attribute-ui",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "apache-nifi-update-attribute-ui",
"dependencies": {
"font-awesome": "4.7.0",
"jquery": "3.6.4",
"jquery-ui-dist": "1.13.2",
"JSON2": "0.1.0",
"qtip2": "3.0.3",
"reset.css": "2.0.2",
"slickgrid": "2.4.45"
},
"engines": {
"node": ">=16.13.2",
"npm": ">=8.1.2"
}
},
"node_modules/ev-emitter": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz",
"integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q=="
},
"node_modules/font-awesome": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
"integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==",
"engines": {
"node": ">=0.10.3"
}
},
"node_modules/imagesloaded": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/imagesloaded/-/imagesloaded-5.0.0.tgz",
"integrity": "sha512-/0JGSubc1MTCoDKVmonLHgbifBWHdyLkun+R/151E1c5n79hiSxcd7cB7mPXFgojYu8xnRZv7GYxzKoxW8BetQ==",
"dependencies": {
"ev-emitter": "^2.1.2"
}
},
"node_modules/jquery": {
"version": "3.6.4",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz",
"integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ=="
},
"node_modules/jquery-ui": {
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.3.tgz",
"integrity": "sha512-D2YJfswSJRh/B8M/zCowDpNFfwsDmtfnMPwjJTyvl+CBqzpYwQ+gFYIbUUlzijy/Qvoy30H1YhoSui4MNYpRwA==",
"dependencies": {
"jquery": ">=1.8.0 <4.0.0"
}
},
"node_modules/jquery-ui-dist": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.13.2.tgz",
"integrity": "sha512-oVDRd1NLtTbBwpRKAYdIRgpWVDzeBhfy7Gu0RmY6JEaZtmBq6kDn1pm5SgDiAotrnDS+RoTRXO6xvcNTxA9tOA==",
"dependencies": {
"jquery": ">=1.8.0 <4.0.0"
}
},
"node_modules/JSON2": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/JSON2/-/JSON2-0.1.0.tgz",
"integrity": "sha512-MRguCg79vy8Kx15/CXzoO5pEPi0tQq7T70mL/t1Hv3G+hVfJVO2BZqX3sl2kbWW08GAmzQYSRfWRtQhmK/eaYA==",
"engines": {
"node": "*"
}
},
"node_modules/qtip2": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/qtip2/-/qtip2-3.0.3.tgz",
"integrity": "sha512-vfSEVYg1teA4g3RhT9fnBXzEQrkgyU5CrQE8j6WzZs5LBupG+Nq97mFq4BmDKcA6mGSMFiIqm70+ydvWW1KnGg==",
"dependencies": {
"imagesloaded": ">=3.0.0",
"jquery": ">=1.6.0"
}
},
"node_modules/reset.css": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/reset.css/-/reset.css-2.0.2.tgz",
"integrity": "sha512-HG5RQLYcAxou3yw+Gnzwan1jJCbOcIBZjwoD/YLWuAd8kkuDI/ZqC0uRhY4ReKOOJaM1Y1kvwebHOwK4P8Sevg=="
},
"node_modules/slickgrid": {
"version": "2.4.45",
"resolved": "https://registry.npmjs.org/slickgrid/-/slickgrid-2.4.45.tgz",
"integrity": "sha512-WvygGTaLU9LnMWZSxqW1agwq8IcDGeCZ289vP1E07eh3ffyLm5TGQsYHXvTwWCHtriZBw+L9RFK/h7TsIMcoLQ==",
"dependencies": {
"jquery": ">=1.8.0",
"jquery-ui": ">=1.8.0"
}
}
}
}

View File

@ -1,42 +0,0 @@
{
"//-01": "Licensed to the Apache Software Foundation (ASF) under one or more",
"//-02": "contributor license agreements. See the NOTICE file distributed with",
"//-03": "this work for additional information regarding copyright ownership.",
"//-04": "The ASF licenses this file to You under the Apache License, Version 2.0",
"//-05": "(the \"License\"); you may not use this file except in compliance with",
"//-06": "the License. You may obtain a copy of the License at",
"//-07": "",
"//-08": "http://www.apache.org/licenses/LICENSE-2.0",
"//-09": "",
"//-10": "Unless required by applicable law or agreed to in writing, software",
"//-11": "distributed under the License is distributed on an \"AS IS\" BASIS,",
"//-12": "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.",
"//-13": "See the License for the specific language governing permissions and",
"//-14": "limitations under the License.",
"name": "apache-nifi-update-attribute-ui",
"description": "Apache NiFi 3rd party client side resources.",
"scripts": {
"ci": "npm ci --ignore-scripts"
},
"dependencies": {
"font-awesome": "4.7.0",
"jquery": "3.6.4",
"jquery-ui-dist": "1.13.2",
"reset.css": "2.0.2",
"slickgrid": "2.4.45",
"qtip2": "3.0.3",
"JSON2": "0.1.0"
},
"engines": {
"node": ">=16.13.2",
"npm": ">=8.1.2"
},
"repository": {
"type": "git",
"url": "git+https://github.com/apache/nifi.git"
},
"bugs": {
"url": "https://github.com/apache/nifi/issues"
},
"homepage": "https://github.com/apache/nifi#readme"
}

View File

@ -157,12 +157,12 @@ public class RuleResource {
} }
// save the criteria // save the criteria
saveCriteria(requestContext, criteria); final ComponentDetails componentDetails = saveCriteria(requestContext, criteria);
// create the response entity // create the response entity
final EvaluationContextEntity responseEntity = new EvaluationContextEntity(); final EvaluationContextEntity responseEntity = new EvaluationContextEntity();
responseEntity.setClientId(requestEntity.getClientId()); responseEntity.setClientId(componentDetails.getRevision().getClientId());
responseEntity.setRevision(requestEntity.getRevision()); responseEntity.setRevision(componentDetails.getRevision().getVersion());
responseEntity.setProcessorId(requestEntity.getProcessorId()); responseEntity.setProcessorId(requestEntity.getProcessorId());
responseEntity.setFlowFilePolicy(criteria.getFlowFilePolicy().name()); responseEntity.setFlowFilePolicy(criteria.getFlowFilePolicy().name());
responseEntity.setRuleOrder(criteria.getRuleOrder()); responseEntity.setRuleOrder(criteria.getRuleOrder());
@ -229,12 +229,12 @@ public class RuleResource {
criteria.addRule(rule); criteria.addRule(rule);
// save the criteria // save the criteria
saveCriteria(requestContext, criteria); final ComponentDetails componentDetails = saveCriteria(requestContext, criteria);
// create the response entity // create the response entity
final RuleEntity responseEntity = new RuleEntity(); final RuleEntity responseEntity = new RuleEntity();
responseEntity.setClientId(requestEntity.getClientId()); responseEntity.setClientId(componentDetails.getRevision().getClientId());
responseEntity.setRevision(requestEntity.getRevision()); responseEntity.setRevision(componentDetails.getRevision().getVersion());
responseEntity.setProcessorId(requestEntity.getProcessorId()); responseEntity.setProcessorId(requestEntity.getProcessorId());
responseEntity.setRule(DtoFactory.createRuleDTO(rule)); responseEntity.setRule(DtoFactory.createRuleDTO(rule));
@ -522,12 +522,12 @@ public class RuleResource {
} }
// save the criteria // save the criteria
saveCriteria(requestContext, criteria); final ComponentDetails componentDetails = saveCriteria(requestContext, criteria);
// create the response entity // create the response entity
final RuleEntity responseEntity = new RuleEntity(); final RuleEntity responseEntity = new RuleEntity();
responseEntity.setClientId(requestEntity.getClientId()); responseEntity.setClientId(componentDetails.getRevision().getClientId());
responseEntity.setRevision(requestEntity.getRevision()); responseEntity.setRevision(componentDetails.getRevision().getVersion());
responseEntity.setProcessorId(requestEntity.getProcessorId()); responseEntity.setProcessorId(requestEntity.getProcessorId());
responseEntity.setRule(DtoFactory.createRuleDTO(rule)); responseEntity.setRule(DtoFactory.createRuleDTO(rule));
@ -570,12 +570,12 @@ public class RuleResource {
criteria.deleteRule(rule); criteria.deleteRule(rule);
// save the criteria // save the criteria
saveCriteria(requestContext, criteria); final ComponentDetails componentDetails = saveCriteria(requestContext, criteria);
// create the response entity // create the response entity
final RulesEntity responseEntity = new RulesEntity(); final RulesEntity responseEntity = new RulesEntity();
responseEntity.setClientId(clientId); responseEntity.setClientId(componentDetails.getRevision().getClientId());
responseEntity.setRevision(revision); responseEntity.setRevision(componentDetails.getRevision().getVersion());
responseEntity.setProcessorId(processorId); responseEntity.setProcessorId(processorId);
// generate the response // generate the response
@ -615,7 +615,7 @@ public class RuleResource {
return criteria; return criteria;
} }
private void saveCriteria(final NiFiWebConfigurationRequestContext requestContext, final Criteria criteria) { private ComponentDetails saveCriteria(final NiFiWebConfigurationRequestContext requestContext, final Criteria criteria) {
// serialize the criteria // serialize the criteria
final String annotationData = CriteriaSerDe.serialize(criteria); final String annotationData = CriteriaSerDe.serialize(criteria);
@ -624,7 +624,7 @@ public class RuleResource {
try { try {
// save the annotation data // save the annotation data
configurationContext.updateComponent(requestContext, annotationData, null); return configurationContext.updateComponent(requestContext, annotationData, null);
} catch (final InvalidRevisionException ire) { } catch (final InvalidRevisionException ire) {
throw new WebApplicationException(ire, invalidRevision(ire.getMessage())); throw new WebApplicationException(ire, invalidRevision(ire.getMessage()));
} catch (final IllegalArgumentException iae) { } catch (final IllegalArgumentException iae) {

View File

@ -206,7 +206,10 @@ APACHE NIFI SUBCOMPONENTS:
The Apache NiFi project contains subcomponents with separate copyright The Apache NiFi project contains subcomponents with separate copyright
notices and license terms. Your use of the source code for the these notices and license terms. Your use of the source code for the these
subcomponents is subject to the terms and conditions of the following subcomponents is subject to the terms and conditions of the following
licenses. licenses.
For the binary distribution of nifi-update-attribute-ui see its 3rdpartylicenses.txt
for additional license and notice information.
The binary distribution of this product bundles 'Antlr 3' which is available The binary distribution of this product bundles 'Antlr 3' which is available
under a "3-clause BSD" license. For details see http://www.antlr3.org/license.html under a "3-clause BSD" license. For details see http://www.antlr3.org/license.html
@ -237,168 +240,3 @@ licenses.
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE. THE POSSIBILITY OF SUCH DAMAGE.
This product bundles 'Fontello' which is available under an MIT license.
Copyright (C) 2011 by Vitaly Puzrin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'CodeMirror' which is available under an MIT style license.
Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'JQuery' which is available under and MIT style license.
(c) 2005, 2014 jQuery Foundation, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'jQuery UI' which is available under an MIT style license.
For details see http://jqueryui.com
Copyright 2014 jQuery Foundation and other contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
This product bundles 'JQuery Event Drag' which is available under an MIT style
license.
Copyright (c) 2008-2015 ThreeDubMedia
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
This product bundles 'json2.js' which is available in the 'public domain'.
For details see https://github.com/douglascrockford/JSON-js
This product bundles 'reset.css' which is available in the 'public domain'.
For details see http://meyerweb.com/eric/tools/css/reset/
This product bundles 'SlickGrid v2.4' which is available under an MIT style license.
Copyright (c) 2009-present Michael Leibman and Ben McIntyre, http://github.com/6pac/slickgrid
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
This product bundles 'qTip2' which is available under an MIT style license.
For details see http://qtip2.com
Copyright (c) 2012 Craig Michael Thompson
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

View File

@ -4,6 +4,9 @@ Copyright 2014-2024 The Apache Software Foundation
This product includes software developed at This product includes software developed at
The Apache Software Foundation (http://www.apache.org/). The Apache Software Foundation (http://www.apache.org/).
For the binary distribution of nifi-update-attribute-ui see its 3rdpartylicenses.txt
for additional license and notice information.
****************** ******************
Apache Software License v2 Apache Software License v2
****************** ******************

View File

@ -1,199 +0,0 @@
<%--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--%>
<%@ page contentType="text/html" pageEncoding="UTF-8" session="false" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="assets/jquery-ui-dist/jquery-ui.min.css" type="text/css" />
<link rel="stylesheet" href="assets/slickgrid/slick.grid.css" type="text/css" />
<link rel="stylesheet" href="css/slick-nifi-theme.css" type="text/css" />
<link rel="stylesheet" href="js/jquery/modal/jquery.modal.css" type="text/css" />
<link rel="stylesheet" href="js/jquery/combo/jquery.combo.css" type="text/css" />
<link rel="stylesheet" href="assets/qtip2/dist/jquery.qtip.min.css" type="text/css" />
<link rel="stylesheet" href="js/codemirror/lib/codemirror.css" type="text/css" />
<link rel="stylesheet" href="js/codemirror/addon/hint/show-hint.css" type="text/css" />
<link rel="stylesheet" href="js/jquery/nfeditor/jquery.nfeditor.css" type="text/css" />
<link rel="stylesheet" href="js/jquery/nfeditor/languages/nfeditor.css" type="text/css" />
<link rel="stylesheet" href="fonts/flowfont/flowfont.css" type="text/css" />
<link rel="stylesheet" href="assets/font-awesome/css/font-awesome.min.css" type="text/css" />
<link rel="stylesheet" href="assets/reset.css/reset.css" type="text/css" />
<link rel="stylesheet" href="css/main.css" type="text/css" />
<link rel="stylesheet" href="css/common-ui.css" type="text/css" />
<script type="text/javascript" src="assets/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery.center.js"></script>
<script type="text/javascript" src="js/jquery/jquery.each.js"></script>
<script type="text/javascript" src="js/jquery/jquery.tab.js"></script>
<script type="text/javascript" src="js/jquery/modal/jquery.modal.js"></script>
<script type="text/javascript" src="js/jquery/combo/jquery.combo.js"></script>
<script type="text/javascript" src="js/jquery/jquery.ellipsis.js"></script>
<script type="text/javascript" src="assets/jquery-ui-dist/jquery-ui.min.js"></script>
<script type="text/javascript" src="assets/qtip2/dist/jquery.qtip.min.js"></script>
<script type="text/javascript" src="assets/JSON2/json2.js"></script>
<script type="text/javascript" src="assets/slickgrid/lib/jquery.event.drag-2.3.0.js"></script>
<script type="text/javascript" src="assets/slickgrid/plugins/slick.cellrangedecorator.js"></script>
<script type="text/javascript" src="assets/slickgrid/plugins/slick.cellrangeselector.js"></script>
<script type="text/javascript" src="assets/slickgrid/plugins/slick.cellselectionmodel.js"></script>
<script type="text/javascript" src="assets/slickgrid/plugins/slick.rowselectionmodel.js"></script>
<script type="text/javascript" src="assets/slickgrid/slick.formatters.js"></script>
<script type="text/javascript" src="assets/slickgrid/slick.editors.js"></script>
<script type="text/javascript" src="assets/slickgrid/slick.dataview.js"></script>
<script type="text/javascript" src="assets/slickgrid/slick.core.js"></script>
<script type="text/javascript" src="assets/slickgrid/slick.grid.js"></script>
<script type="text/javascript" src="js/codemirror/lib/codemirror-compressed.js"></script>
<script type="text/javascript" src="js/nf/nf-namespace.js"></script>
<script type="text/javascript" src="js/nf/nf-authorization-storage.js"></script>
<script type="text/javascript" src="js/nf/nf-storage.js"></script>
<script type="text/javascript" src="js/nf/nf-ajax-setup.js"></script>
<script type="text/javascript" src="js/nf/nf-universal-capture.js"></script>
<script type="text/javascript" src="js/jquery/nfeditor/languages/nfel.js"></script>
<script type="text/javascript" src="js/jquery/nfeditor/jquery.nfeditor.js"></script>
<script type="text/javascript" src="js/application.js"></script>
<title>Update Attribute</title>
</head>
<body>
<div id="attribute-updater-processor-id" class="hidden"><%= request.getParameter("id") == null ? "" : org.apache.nifi.util.EscapeUtils.escapeHtml(request.getParameter("id")) %></div>
<div id="attribute-updater-client-id" class="hidden"><%= request.getParameter("clientId") == null ? "" : org.apache.nifi.util.EscapeUtils.escapeHtml(request.getParameter("clientId")) %></div>
<div id="attribute-updater-revision" class="hidden"><%= request.getParameter("revision") == null ? "" : org.apache.nifi.util.EscapeUtils.escapeHtml(request.getParameter("revision")) %></div>
<div id="attribute-updater-editable" class="hidden"><%= request.getParameter("editable") == null ? "" : org.apache.nifi.util.EscapeUtils.escapeHtml(request.getParameter("editable")) %></div>
<div id="attribute-updater-disconnected-node-acknowledged" class="hidden"><%= request.getParameter("disconnectedNodeAcknowledged") == null ? "false" : org.apache.nifi.util.EscapeUtils.escapeHtml(request.getParameter("disconnectedNodeAcknowledged")) %></div>
<div id="update-attributes-content">
<div id="rule-list-panel">
<div id="flowfile-policy-container">
<span id="selected-flowfile-policy" class="hidden"></span>
<div id="flowfile-policy-label" class="large-label">FlowFile Policy</div>
<div class="info fa fa-question-circle" title="Defines the behavior when multiple rules match. Use clone will ensure that each matching rule is executed with a copy of the original flowfile. Use original will execute all matching rules with the original flowfile in the order specified below."></div>
<div id="flowfile-policy"></div>
<div class="clear"></div>
</div>
<div id="rule-label-container">
<div id="rules-label" class="large-label">Rules</div>
<div class="info fa fa-question-circle" title="Click and drag to change the order that rules are evaluated."></div>
<button id="new-rule" class="new-rule hidden fa fa-plus"></button>
<div class="clear"></div>
</div>
<div id="rule-list-container">
<ul id="rule-list"></ul>
</div>
<div id="no-rules" class="unset">No rules found.</div>
<div id="rule-filter-controls" class="hidden">
<div id="rule-filter-container">
<input type="text" placeholder="Filter" id="rule-filter"/>
<div id="rule-filter-type"></div>
</div>
<div id="rule-filter-stats" class="filter-status">
Displaying&nbsp;<span id="displayed-rules"></span>&nbsp;of&nbsp;<span id="total-rules"></span>
</div>
</div>
</div>
<div id="rule-details-panel">
<div id="selected-rule-name-container" class="selected-rule-detail">
<div class="large-label">Rule Name</div>
<div id="selected-rule-id" class="hidden"></div>
<div id="no-rule-selected-label" class="unset">No rule selected.</div>
<input type="text" id="selected-rule-name" class="hidden"></input>
</div>
<div id="selected-rule-comments-container" class="selected-rule-detail">
<div class="large-label">Rule Comments</div>
<textarea id="selected-rule-comments" rows="4" cols="60"></textarea>
</div>
<div id="selected-rule-conditions-container" class="selected-rule-detail">
<div class="large-label-container">
<div id="conditions-label" class="large-label">Conditions</div>
<div class="info fa fa-question-circle" title="All conditions must be met for this rule to match."></div>
<button id="new-condition" title="New Condition" class="new-condition hidden fa fa-plus"></button>
<div class="clear"></div>
</div>
<div id="selected-rule-conditions"></div>
</div>
<div id="selected-rule-actions-container" class="selected-rule-detail">
<div class="large-label-container">
<div id="actions-label" class="large-label">Actions</div>
<button id="new-action" title="New Action" class="new-action hidden fa fa-plus"></button>
<div class="clear"></div>
</div>
<div id="selected-rule-actions"></div>
</div>
<div class="clear"></div>
</div>
<div id="message-and-save-container">
<div id="message"></div>
<div id="selected-rule-save" class="button hidden">Save</div>
</div>
<div class="clear"></div>
<div id="glass-pane"></div>
<div id="ok-dialog" class="small-dialog">
<div id="ok-dialog-content" class="dialog-content"></div>
</div>
<div id="yes-no-dialog" class="small-dialog">
<div id="yes-no-dialog-content" class="dialog-content"></div>
</div>
<div id="new-rule-dialog" class="small-dialog">
<div class="dialog-content">
<div class="rule-setting">
<div class="setting-name">Rule name</div>
<div>
<input id="new-rule-name" type="text" />
</div>
</div>
<div class="rule-setting">
<div class="setting-name">Copy from existing rule (optional)</div>
<div>
<input id="copy-from-rule-name" placeholder="Search rule name" type="text" class="search" />
</div>
</div>
</div>
</div>
<div id="new-condition-dialog" class="dialog">
<div>
<div class="rule-setting">
<div class="setting-name">Expression</div>
<div>
<div id="new-condition-expression"></div>
</div>
</div>
</div>
<div id="new-condition-button-container">
<div id="new-condition-add" class="button button-normal">Add</div>
<div id="new-condition-cancel" class="secondary-button button-normal">Cancel</div>
<div class="clear"></div>
</div>
</div>
<div id="new-action-dialog" class="dialog">
<div style="margin-bottom: 32px;">
<div class="rule-setting">
<div class="setting-name">Attribute</div>
<div id="new-action-attribute-container">
<input id="new-action-attribute" type="text"></input>
</div>
</div>
<div class="rule-setting">
<div class="setting-name">Value</div>
<div>
<div id="new-action-value"></div>
</div>
</div>
</div>
<div id="new-action-button-container">
<div id="new-action-add" class="button button-normal">Add</div>
<div id="new-action-cancel" class="secondary-button button-normal">Cancel</div>
<div class="clear"></div>
</div>
</div>
</div>
</body>
</html>

View File

@ -33,13 +33,19 @@
<servlet-name>api</servlet-name> <servlet-name>api</servlet-name>
<url-pattern>/api/*</url-pattern> <url-pattern>/api/*</url-pattern>
</servlet-mapping> </servlet-mapping>
<servlet> <!-- fragment filter -->
<servlet-name>worksheet</servlet-name> <filter>
<jsp-file>/WEB-INF/jsp/worksheet.jsp</jsp-file> <filter-name>FragmentFilter</filter-name>
</servlet> <filter-class>org.apache.nifi.web.servlet.filter.QueryStringToFragmentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FragmentFilter</filter-name>
<url-pattern></url-pattern>
</filter-mapping>
<servlet-mapping> <servlet-mapping>
<servlet-name>worksheet</servlet-name> <servlet-name>default</servlet-name>
<url-pattern></url-pattern> <url-pattern></url-pattern>
</servlet-mapping> </servlet-mapping>
</web-app> </web-app>

View File

@ -1,734 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
src: local('Roboto Light'),
local('Roboto-Light'),
url('../fonts/Roboto/Roboto-Light.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 300;
src: local('Roboto LightItalic'),
local('Roboto-LightItalic'),
url('../fonts/Roboto/Roboto-LightItalic.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: normal;
src: local('Roboto Regular'),
local('Roboto-Regular'),
url('../fonts/Roboto/Roboto-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'),
local('Roboto-Medium'),
url('../fonts/Roboto/Roboto-Medium.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: bold;
src: local('Roboto Bold'),
local('Roboto-Bold'),
url('../fonts/Roboto/Roboto-Bold.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: normal;
src: local('Roboto Italic'),
local('Roboto-Italic'),
url('../fonts/Roboto/Roboto-Italic.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto Slab';
font-style: normal;
font-weight: normal;
src: local('RobotoSlab Regular'),
local('RobotoSlab-Regular'),
url('../fonts/Roboto_Slab/RobotoSlab-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'Roboto Slab';
font-style: normal;
font-weight: bold;
src: local('RobotoSlab Bold'),
local('RobotoSlab-Bold'),
url('../fonts/Roboto_Slab/RobotoSlab-Bold.ttf') format('truetype');
}
/*remove margin from font awesome*/
i[class^="fa-"]:before, i[class*=" fa-"]:before {
margin: -1px;
}
/*remove margin from flowfont*/
i[class^="icon-"]:before, i[class*=" icon-"]:before {
margin: -2px;
}
/*shift rotated font awesome icons*/
.fa-rotate-90 {
left: -2px !important;
}
body {
display: block;
font-family: Roboto, sans-serif;
overflow: hidden;
color: #262626;
}
body.md-default-theme, body, html.md-default-theme, html {
background-color: white;
}
button {
border-radius: 0;
}
.value-color {
color: #775351;
}
ul.links li {
float: left;
display: block;
margin-left: 10px;
padding: 4px;
text-align: center;
font-size: 11px;
font-weight: normal;
text-decoration: none;
}
ul.links span.header-link-over {
color: #264c58;
text-decoration: underline;
}
/*
General Styles
*/
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.clear {
clear: both;
}
.pointer {
cursor: pointer !important;
}
.hidden {
display: none;
}
.blank, .unset, .sensitive {
font-weight: normal !important;
color: #a8a8a8 !important;
}
.required {
font-weight: bold !important;
}
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ellipsis.multiline {
white-space: normal;
}
.table-cell {
overflow: hidden;
white-space: nowrap;
line-height: normal;
float: left;
margin-top: 4px;
}
label {
font-family: 'Roboto Slab', serif;
font-size: 12px;
color: #262626; /*base-font-color*/
letter-spacing: 0.05rem;
display: block;
margin-bottom: 2px;
}
/* placeholder styles */
*::placeholder {
color: #728e9b;
}
*::-webkit-input-placeholder {
color: #728e9b;
}
*:-moz-placeholder {
color: #728e9b;
}
*::-moz-placeholder {
color: #728e9b;
}
*:-ms-input-placeholder {
color: #728e9b;
}
input[type=text], input[type=password] {
background-color: #eaeef0;
border: 1px solid #eaeef0;
font-family: Roboto, sans-serif;
font-size: 13px;
padding: 0px 10px 0px 10px;
resize: none;
height: 32px;
width: 100%;
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box; /* Firefox, other Gecko */
box-sizing: border-box;
color: #262626;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
input:focus, textarea:focus {
background-color: #fff;
border: 1px solid #004849; /*link-color*/
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
outline: none;
}
textarea {
background-color: #eaeef0;
border: 1px solid #eaeef0;
font-family: Roboto, sans-serif;
font-size: 13px !important;
padding: 10px 10px;
resize: vertical;
height: 32px;
width: 100%;
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box; /* Firefox, other Gecko */
box-sizing: border-box;
color: #262626;
white-space: pre-wrap;
overflow-y: auto;
overflow-x: hidden;
text-overflow: ellipsis;
}
textarea[disabled] {
background: #b2b8c1;
color: #dbdee2;
border: 1px solid #b2b8c1;
}
ul.property-info {
list-style-type: disc;
margin-left: 10px;
}
ul.property-info li {
padding: 0px 0px;
margin-left: 10px;
}
div.nf-checkbox {
cursor: pointer;
width: 12px;
height: 12px;
float: left;
margin-right: 4px;
}
.nf-checkbox-label {
cursor: pointer;
}
div.nf-checkbox.disabled {
opacity: .5;
cursor: not-allowed;
}
div.checkbox-unchecked {
background: transparent url(../images/inputCheckbox.png) no-repeat scroll top left;
}
div.checkbox-checked {
background: transparent url(../images/inputCheckbox.png) no-repeat scroll top right;
}
div.ajax-loading {
background-image: url(../images/iconLoading.gif);
}
div.ajax-complete:before {
font-family: FontAwesome;
content: "\f00c";
font-size: 16px;
color: #70B59A;
}
div.ajax-error:before {
font-family: FontAwesome;
content: "\f00d";
font-size: 16px;
color: #D18686;
}
.refresh-button {
float: left;
}
.ui-draggable .dialog-header {
cursor: move;
}
span.link:focus {
outline: none;
}
span.link {
cursor: pointer;
color: #004849; /*link-color*/
font-weight: normal;
display: inline-block;
border-bottom: 1px solid #CCDADB;
font-size: 13px;
font-family: Roboto;
}
span.link-over {
border-bottom: 1px solid #004849;
}
span.link-bold {
font-weight: bold;
border-bottom: none;
}
button {
height: 28px;
width: 28px;
border: 1px solid #CCDADB; /*tint link-color 80%*/
background-color: rgba(249, 250, 251, 0.97);
color: #004849;
}
button.refresh-button {
font-size: 16px;
}
button:hover {
border: 1px solid #004849; /*link-color*/
}
button:disabled {
color: #CCDADB !important; /*tint link-color 80%*/
cursor: not-allowed;
border: 1px solid #CCDADB; /*tint link-color 80%*/
}
/* angular material override */
button:focus {
outline: none;
}
div:focus {
outline: none;
}
input:focus {
background-color: #fff;
border: 1px solid #004849; /*link-color*/
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
outline: none;
}
/* filter controls */
.filter-controls {
position: absolute;
top: 10px;
}
.filter-container {
height: 32px;
width: 100%;
float: left;
}
.filter {
margin-right: 3px;
float: left;
}
input.filter {
width: 173px;
}
.filter-type,
.filter-status-dropdown {
float: left;
width: 148px;
}
.filter-status {
margin-top: 10px;
color: #775351;
font-family: Roboto;
font-size: 13px;
font-weight: 500;
margin-bottom: 5px;
}
.setting-field.summary-filter-primary-node-container {
display: inline-block;
margin-left: 10px;
margin-top: 8px;
width: auto;
}
/* overlay icon styles */
.stop-configure-icon.fa-stop {
display : inline-block;
font-size: 15px;
position : relative;
top : -1px;
}
.stop-configure-icon::after {
content : "\f013";
font-size: 14px;
position : relative;
top : 0px;
left : -8px;
color : #ffffff;
-webkit-text-stroke-width : 1px;
-webkit-text-stroke-color : #004849;
}
*.stop-configure-icon + span {
display : inline-block;
padding : 0px 0px 0px 0px;
margin-left : -10px;
}
/* buttons */
button.fa {
color: #004849;
font-size: 16px;
cursor: pointer;
line-height: 25px;
}
button.icon {
color: #004849;
font-size: 16px;
}
div.button-icon span {
padding-left: 5px;
vertical-align: middle;
font-style: normal;
font-family: Roboto;
font-size: 11px;
}
div.button-icon {
float: left !important;
margin-left: 0;
font-size: 18px !important;
}
div.button.auto-width,
div.button-icon.auto-width {
width : auto !important;
}
div.button {
height: 32px;
width: 90px;
padding: 0 8px;
text-transform: uppercase;
font-weight: 500;
font-size: 11px;
line-height: 33px;
text-align: center;
border: 0px;
float: right;
position: relative;
background: #728E9B;
color: #fff;
cursor: pointer;
}
div.button.disabled-button {
color: #a8a8a8 !important;
cursor: not-allowed;
opacity: 0.7;
}
div.button:hover:not(.disabled-button) {
background-color: #004849;
}
div.secondary-button {
height: 32px;
width: 90px;
padding: 0 8px;
text-transform: uppercase;
font-weight: 500;
font-size: 11px;
line-height: 33px;
text-align: center;
border: 0px;
float: right;
position: relative;
background: #E3E8EB;
color: #004849;
cursor:pointer
}
div.secondary-button:hover {
background-color: #C7D2D7;
}
/* tooltips */
.qtip-nifi {
border: 0px !important;
border-radius: 2px;
background-color: rgba(0, 0, 0, 0.54) !important;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
font-family: Roboto;
font-weight: 500;
font-size: 13px;
color: #fff !important;
}
div.nifi-tooltip {
border: 0px !important;
border-radius: 2px;
background-color: rgba(0, 0, 0, 0.80) !important;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
font-family: Roboto;
font-weight: 500;
font-size: 13px;
color: #fff !important;
max-width: 500px;
word-wrap: break-word;
}
.scrollable {
border-bottom: 1px solid #d0dbe0;
}
/*context menu */
.context-menu {
display: none;
position: absolute;
z-index: 10006;
font-size: 13px;
padding:3px 0;
background-color:rgba(249,250,251,0.97); /*tint base-color 96%*/
border:1px solid #004849; /*link-color*/
box-shadow: 0 3px 6px rgba(0,0,0,0.3);
width: 215px;
max-height: inherit;
color:#004849
}
div.context-menu-item {
cursor: pointer;
height: 20px;
padding-top: 4px;
padding-left: 4px;
}
div.context-menu-item.hover {
background-color:#C7D2D7; /*tint base-color 60%*/
box-shadow:0 1px 1px rgba(0,0,0,0.15);
}
.context-menu-item-img {
float: left;
width: 16px;
height: 16px;
background-size: cover;
}
.context-menu-item-img.fa {
position: relative;
top: 2px;
left: 2px;
}
.context-menu-item-img.icon {
position: relative;
top: 1px;
left: 3px;
}
div.context-menu-item-text {
margin-left: 4px;
line-height: 16px;
float: left;
color: #262626;
}
div.context-menu-group-item-img {
float: right;
width: 16px;
height: 16px;
background-size: cover;
font-size: 14px;
}
div.context-menu-item-separator {
height: 1px;
background-color: #C7D2D7;
margin-top: 3px;
margin-bottom: 3px;
}
/* search */
li.search-no-matches {
padding: 4px;
font-weight: bold;
color: #aaa;
font-style: italic;
}
/* progress bars */
md-progress-linear > div {
background-color: #eaeef0 !important;
}
.setting {
margin-bottom: 15px;
}
.setting-name {
font-size: 12px;
font-weight: 500;
font-family: Roboto Slab;
text-transform: capitalize;
padding-bottom: 4px;
color: #262626;
}
.setting-name .fa {
color: #004849;
margin-left: 5px;
}
.setting-field .fa {
color: #004849;
margin-left: 5px;
line-height: 22px;
}
.setting-field {
line-height: normal;
width: 100%;
color: #775351;
font-size: 13px;
font-weight: 500;
}
.setting-header {
color: #728e9b;
font-size: 12pt;
font-family: 'Roboto Slab';
font-style: normal;
font-weight: bold;
padding-bottom: 20px;
text-overflow: ellipsis;
}
.CodeMirror {
border: 1px solid #aaa;
font-family: monospace;
background-color: #fff;
cursor: default;
line-height: normal;
}
/* jquery ui autocomplete override */
.ui-autocomplete {
overflow: auto !important;
border: 1px solid #aaaaaa !important;
font-size: 12px !important;
font-family: Roboto !important;
}
.ui-menu .ui-menu-item a {
display: block;
border: 1px solid transparent;
line-height: 1.5;
margin: 0 !important;
color: #333 !important;
}
.ui-menu .ui-menu-item a.ui-state-active {
background: #D4E0E5 !important;
border: 1px solid #999999;
}
/* jquery ui slider override */
.ui-slider-handle.ui-state-active {
background: #fff !important;
}

View File

@ -1,380 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
document styles
*/
body {
display: block;
font-family: Roboto, sans-serif;
font-size: 62.5%;
overflow: hidden;
color: #262626;
}
#update-attributes-content {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
padding: 5px;
}
/* new rule */
div.new-rule {
float: right;
background: url("../images/buttonNew.png") no-repeat scroll left top transparent;
cursor: pointer;
height: 19px;
width: 19px;
}
#new-rule-dialog {
display: none;
z-index: 1301;
}
#update-attributes-content .ui-autocomplete {
max-height: 400px;
overflow: auto;
border: 1px solid #aaaaaa;
z-index: 1351;
border-radius: 0;
}
#update-attributes-content .ui-menu .ui-menu-item a.ui-state-focus {
background: #D4E0E5 !important;
border: 1px solid #999999;
border-radius: 0;
}
/* rule list panel */
#rule-label-container {
line-height: 28px;
}
div.large-label {
color: #728e9b;
font-size: 12pt;
font-family: 'Roboto Slab';
font-style: normal;
font-weight: bold;
padding-bottom: 10px;
text-overflow: ellipsis;
float: left;
}
div.label {
font-size: 12px;
font-weight: 500;
font-family: Roboto Slab;
padding-bottom: 4px;
color: #262626;
}
#rule-list-panel {
position: absolute;
top: 5px;
bottom: 5px;
left: 20px;
right: 65%;
}
#rule-list-container {
overflow-y: auto;
display: none;
position: absolute;
top: 116px;
bottom: 175px;
left: 0px;
right: 0px;
min-height: 45px;
}
#flowfile-policy-container {
margin-bottom: 20px;
}
#rule-list {
list-style-type: none;
background: #eaeef0;
padding: 4px 3px 1px 3px;
}
#rule-list li {
background: #fff;
border-top: 1px solid #CCDADB;
border-right: 1px solid #CCDADB;
border-bottom: 1px solid #CCDADB;
border-left: 1px solid #CCDADB;
color: #004849;
font-weight: 500;
cursor: grab;
cursor: -moz-grab;
cursor: -webkit-grab;
line-height: 32px;
height: 32px;
padding: 0px 10px;
box-shadow: 0 1px 1px rgba(0,0,0,0.4);
margin-bottom: 5px;
display: flex;
}
#rule-list li.selected {
background: #355B6A;
border-top: 1px solid #AAC1CE;
border-right: 1px solid #85A6B8;
border-bottom: 1px solid #618BA3;
border-left: 1px solid #85A6B8;
color: #fff;
font-weight: bold;
line-height: 32px;
height: 32px;
padding: 0px 10px;
}
#rule-list li.unsaved {
font-weight: bold;
font-size: 13px;
cursor: default;
}
div.rule-label {
float: left;
flex-grow: 1;
}
div.remove-rule {
float: right;
cursor: pointer;
line-height: 32px;
}
#rule-filter-controls {
position: absolute;
bottom: 63px;
left: 0px;
right: 0px;
}
#rule-filter-type {
margin-top: 10px;
}
/* rule details panel */
#rule-details-panel {
overflow: auto;
position: absolute;
top: 5px;
bottom: 42px;
left: 37%;
right: 20px;
}
#no-rule-selected-label {
line-height: 32px;
position: absolute;
left: 0px;
top: 26px;
}
div.large-label-container {
margin-top: 10px;
line-height: 28px;
}
#flowfile-policy {
clear: both;
}
#new-condition {
cursor: pointer;
position: absolute;
right: 0px;
}
#actions-label {
float: left;
line-height: 28px;
}
#selected-rule-conditions {
height: 200px;
}
#selected-rule-comments-container {
margin-top: 75px;
}
#selected-rule-comments {
height: 50px;
}
#selected-rule-actions-container {
padding-top: 20px;
}
#selected-rule-actions-container div.slick-viewport {
overflow-x: hidden !important;
}
#selected-rule-conditions-container {
padding-top: 8px;
}
#selected-rule-conditions-container div.slick-viewport {
overflow-x: hidden !important;
}
#selected-rule-name {
position: absolute;
right: 0px;
top: 26px;
}
#new-action {
cursor: pointer;
position: absolute;
right: 0px;
}
#new-rule {
float: right;
}
#selected-rule-actions {
height: 200px;
}
#message {
color: #f0ad4e;
margin-left: 20px;
margin-right: 20px;
line-height: 32px;
font-size: 13px;
font-weight: bold;
flex-grow: 1;
overflow: auto;
width: 100%;
height: 41px;
}
#message-and-save-container {
position: absolute;
right: 0px;
left: 0px;
bottom: 0px;
display: flex;
}
#selected-rule-save {
margin-right: 20px;
margin-top: 10px;
}
input.editor-text {
background: none repeat scroll 0 0 transparent;
border: 0 none;
height: 100%;
margin: 0;
outline: 0 none;
padding: 0;
width: 100%;
}
/* general styles */
#ok-dialog {
display: none;
}
#yes-no-dialog {
display: none;
}
#new-condition-dialog {
display: none;
z-index: 1299;
cursor: move;
padding: 10px;
}
#new-condition-dialog .nf-editor {
margin-bottom: 32px;
}
#new-condition-attribute {
width: 374px;
}
#new-action-button-container, #new-condition-button-container {
bottom: 0;
left: 0;
position: absolute;
right: 0;
}
#new-action-dialog {
display: none;
z-index: 1299;
cursor: move;
padding: 10px;
}
#new-action-dialog .nf-editor {
margin-bottom: 32px;
}
div.slickgrid-nf-editor .nf-editor {
margin-bottom: 37px;
}
div.property-detail .nf-editor {
margin-bottom: 30px;
}
div.rule-setting {
margin-bottom: 10px;
}
.hidden {
display: none;
}
.clear {
clear: both;
}
.unset {
font-style: italic;
color: #aaa;
}
.pointer {
cursor: pointer;
}
.info {
color: #004849;
margin-left: 5px;
font-size: 12px;
}

View File

@ -1,153 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* nifi specific slick grid theme based on the supplied slick-default-theme.css */
.slick-header-columns {
color: #fff;
background-color: #728E9B;
}
.slick-header-column {
background: #728E9B;
color: #fff;
font-weight: bold;
cursor: pointer;
}
.slick-header-column:hover, .slick-header-column-active {
color: #fff;
}
.slick-row {
position: absolute;
background: white;
border: 0;
line-height: 22px;
}
.slick-row:hover {
background-color: #dce3e6 !important;
}
.slick-cell {
padding-left: 10px;
padding-right: 10px;
}
.slick-cell.selected {
background-color: #ffef85;
border-top: 1px solid #000000;
border-bottom: 1px solid #000000;
padding-top: 0px;
}
.slick-row.odd {
background: #f4f6f7;
}
.slick-cell.invalid {
border-color: #ba554a;
}
.slickgrid-editor > textarea {
resize: both;
}
.grid-canvas .slick-cell:first-child{
border-left: 0;
}
.slick-viewport .fa {
color: #004849;
line-height: 22px;
margin-top: 0;
width: 12px;
height: 12px;
float: left;
margin-right: 5px;
text-align: center;
}
.slick-viewport .icon {
color: #004849;
line-height: 24px;
margin-top: 0;
width: 12px;
height: 12px;
float: left;
margin-right: 5px;
text-align: center;
}
.slick-header.ui-state-default {
background-color: #728E9B;
}
.slick-header.ui-state-default, .slick-headerrow.ui-state-default {
font-family: Roboto;
font-weight: 500;
font-size: 12px;
font-style: normal;
border: 0px;
}
.slick-header-column.ui-state-default {
height: 24px;
line-height: 24px;
border-right: 1px solid #728E9B;
}
.slick-sortable-placeholder {
background: #728E9B;
}
.slick-row.ui-widget-content, .slick-row.ui-state-active {
font-family: Roboto;
font-size: 12px;
font-style: normal;
font-weight: normal;
color: #262626;
}
.slick-cell, .slick-headerrow-column {
border-right: 0;
border-top: 0;
border-left: 1px solid #c7d2d7;
border-bottom: 1px solid #c7d2d7;
padding: 1px 2px 5px 10px;
}
div.status-text {
padding-left: 4px;
line-height: 22px;
overflow: hidden;
text-overflow: ellipsis;
float: left;
}
.slick-sort-indicator {
float: none !important;
}
.slick-sort-indicator-desc {
background: url(../images/sort-desc.gif) !important;
}
.slick-sort-indicator-asc {
background: url(../images/sort-asc.gif) !important;
}

View File

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,87 +0,0 @@
@font-face {
font-family: 'flowfont';
src: url('./flowfont.eot?8516181');
src: url('./flowfont.eot?8516181#iefix') format('embedded-opentype'),
url('./flowfont.woff2?8516181') format('woff2'),
url('./flowfont.woff?8516181') format('woff'),
url('./flowfont.ttf?8516181') format('truetype'),
url('./flowfont.svg?8516181#flowfont') format('svg');
font-weight: normal;
font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'flowfont';
src: url('../font/flowfont.svg?8516181#flowfont') format('svg');
}
}
*/
[class^="icon-"]:before, [class*=" icon-"]:before {
font-family: "flowfont";
font-style: normal;
font-weight: normal;
speak: never;
display: inline-block;
text-decoration: inherit;
width: 1em;
margin-right: .2em;
text-align: center;
/* opacity: .8; */
/* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal;
text-transform: none;
/* fix buttons height, for twitter bootstrap */
line-height: 1em;
/* Animation center compensation - margins should be symmetric */
/* remove if not needed */
margin-left: .2em;
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
/* Font smoothing. That was taken from TWBS */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.icon-funnel-add:before { content: '\e800'; } /* '' */
.icon-counter:before { content: '\e801'; } /* '' */
.icon-enable-false:before { content: '\e802'; } /* '' */
.icon-funnel:before { content: '\e803'; } /* '' */
.icon-group:before { content: '\e804'; } /* '' */
.icon-group-remote:before { content: '\e805'; } /* '' */
.icon-label:before { content: '\e806'; } /* '' */
.icon-processor:before { content: '\e807'; } /* '' */
.icon-provenance:before { content: '\e808'; } /* '' */
.icon-template:before { content: '\e809'; } /* '' */
.icon-transmit-false:before { content: '\e80a'; } /* '' */
.icon-zoom-actual:before { content: '\e80b'; } /* '' */
.icon-zoom-fit:before { content: '\e80c'; } /* '' */
.icon-label-add:before { content: '\e80d'; } /* '' */
.icon-template-add:before { content: '\e80e'; } /* '' */
.icon-group-add:before { content: '\e80f'; } /* '' */
.icon-template-import:before { content: '\e810'; } /* '' */
.icon-template-save:before { content: '\e811'; } /* '' */
.icon-group-remote-add:before { content: '\e812'; } /* '' */
.icon-port-out-add:before { content: '\e813'; } /* '' */
.icon-port-in-add:before { content: '\e814'; } /* '' */
.icon-processor-add:before { content: '\e815'; } /* '' */
.icon-lineage:before { content: '\e816'; } /* '' */
.icon-import-from-registry-add:before { content: '\e81d'; } /* '' */
.icon-import-from-registry:before { content: '\e81e'; } /* '' */
.icon-port-in:before { content: '\e832'; } /* '' */
.icon-port-out:before { content: '\e833'; } /* '' */
.icon-connect:before { content: '\e834'; } /* '' */
.icon-connect-add:before { content: '\e835'; } /* '' */
.icon-threads:before { content: '\e83f'; } /* '' */
.icon-drop:before { content: '\e888'; } /* '' */

View File

@ -1,72 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2023 by original authors @ fontello.com</metadata>
<defs>
<font id="flowfont" horiz-adv-x="1000" >
<font-face font-family="flowfont" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="funnel-add" unicode="&#xe800;" d="M948 786h-114a52 52 0 0 1-53-52v-147l-183-77a305 305 0 0 1-35 11l78 110h51a52 52 0 0 1 52 52v115a52 52 0 0 1-52 52h-114a52 52 0 0 1-52-52v-114a52 52 0 0 1 52-53h29l-74-108c-9 0-18-2-28-2s-19 4-28 3l-73 107h18a52 52 0 0 1 52 52v115a52 52 0 0 1-52 52h-114a52 52 0 0 1-51-52v-114a52 52 0 0 1 51-53h61l75-111a379 379 0 0 1-38-8l-187 75v147a52 52 0 0 1-53 52h-114a52 52 0 0 1-52-52v-114a52 52 0 0 1 52-51h156l159-68a39 39 0 0 1-28-29c0-28 74-51 166-51s167 22 167 50a40 40 0 0 1-29 31l159 67h146a52 52 0 0 1 52 51v114a52 52 0 0 1-52 52z m-365-128a31 31 0 0 0-32 31v104a31 31 0 0 0 32 31h105a31 31 0 0 0 31-31v-104a31 31 0 0 0-31-31h-105z m-270 0a31 31 0 0 0-32 31v104a31 31 0 0 0 32 31h104a31 31 0 0 0 31-31v-104a31 31 0 0 0-31-31h-104z m-121-33a31 31 0 0 0-31-32h-104a31 31 0 0 0-31 32v104a31 31 0 0 0 31 31h104a31 31 0 0 0 31-31v-104z m781 0a31 31 0 0 0-31-32h-103a31 31 0 0 0-31 32v104a31 31 0 0 0 31 31h104a31 31 0 0 0 31-31v-104z m-689-257a234 234 0 1 1 234-234 234 234 0 0 1-234 234z m140-268a9 9 0 0 0-9-9h-81a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-66a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-80a9 9 0 0 0-9 9v66a9 9 0 0 0 9 9h81a9 9 0 0 1 10 9v82a9 9 0 0 0 7 8h65a9 9 0 0 0 9-9v-81a9 9 0 0 1 9-9h81a9 9 0 0 0 9-9v-66z m153 252v-164a18 18 0 0 1 19-19h60c12 0 14-7 7-15l-115-122a281 281 0 0 1-164 366 514 514 0 0 1 121-14c20 0 194 2 202 80h12v-2a31 31 0 0 0 0-5c0-69-78-95-142-104z m51-301v-150a52 52 0 0 0-52-51h-138a52 52 0 0 0-43 22 281 281 0 0 1 43 23 31 31 0 0 1 18-6h104a31 31 0 0 1 31 31v96z" horiz-adv-x="1000" />
<glyph glyph-name="counter" unicode="&#xe801;" d="M878-17h-756c-67 0-122 54-122 121v492c0 67 55 121 122 121h756c68 0 122-54 122-121v-492c0-67-54-121-122-121z m-756 670c-32 0-58-26-58-57v-492c0-31 26-57 58-57h756c32 0 58 26 58 57v492c0 31-26 57-58 57h-756z m358-535h-314v62l148 158c20 22 35 42 45 58 10 17 15 33 15 47 0 21-5 37-15 48-11 12-25 18-45 18-20 0-36-7-48-21-12-15-18-33-18-56h-91c0 28 7 53 20 76 13 23 32 41 56 54 25 13 52 20 83 20 47 0 84-11 110-34s39-55 39-96c0-22-6-45-18-69-11-23-31-51-60-82l-104-110h197v-73z m344 457c8-17 12-36 12-57 0-21-7-41-19-58-13-18-30-31-51-41 26-9 45-23 58-41 13-19 19-40 19-66 0-40-15-73-44-97s-69-37-118-37c-46 0-83 12-112 36-29 24-44 56-44 96h91c0-18 7-32 20-42 12-11 28-17 47-17 22 0 39 6 51 17 12 12 18 27 18 46 0 45-25 68-75 68h-48v71h48c23 0 40 6 51 17 12 12 17 27 17 46 0 19-5 33-16 43-11 11-26 16-45 16l140 0z m-141 0c-18 0-32-5-44-15-11-9-17-21-17-37h-91c0 19 4 36 12 52h140z m0-457l25 39h92v-39h-117z" horiz-adv-x="1000" />
<glyph glyph-name="enable-false" unicode="&#xe802;" d="M912-123l-297 296-144-308c-5-9-14-15-25-15-3 0-6 1-9 1-13 4-21 17-18 30l96 392-71 70-150-37c-3-1-5-1-7-1-7 0-14 2-19 7-7 5-10 14-8 23l38 154-251 250 41 42 865-862-41-42z m-117 683c5 9 3 20-4 27-5 5-12 9-20 9-3 0-5-1-7-1l-238-59 102 278c2 4 3 7 3 11 0 14-12 25-27 25h-197c-12 0-23-8-26-19l-42-172 343-342 113 243z" horiz-adv-x="1000" />
<glyph glyph-name="funnel" unicode="&#xe803;" d="M782 734v-147l-183-77c-11 2-21 9-35 11l77 111h51c28 0 52 23 52 52v114c0 29-24 52-52 52h-114c-29 0-52-23-52-52v-114c0-29 23-52 52-52h29l-74-108c-9 0-18-2-28-2-9 0-19 3-28 3l-73 107h18c29 0 52 23 52 52v114c0 29-23 52-52 52h-113c-29 0-53-23-53-52v-114c0-29 24-52 53-52h60l75-111c-13-2-27-6-38-9l-188 75v147c0 29-23 52-52 52h-114c-29 0-52-23-52-52v-114c0-29 23-52 52-52h157l158-68c-18-8-28-19-28-29 0-27 74-50 166-50 92 0 166 22 166 49 0 10-10 22-28 30l159 68h146c29 0 52 23 52 52v114c0 29-23 52-52 52h-114c-29 0-52-23-52-52z m-231-45v104c0 17 14 31 32 31h104c17 0 31-14 31-31v-104c0-17-14-31-31-31h-104c-18 0-32 14-32 31z m-269 0v104c0 17 14 31 31 31h105c17 0 31-14 31-31v-104c0-17-14-31-31-31h-105c-17 0-31 14-31 31z m-121-95h-104c-17 0-31 14-31 31v104c0 17 14 31 31 31h104c17 0 31-14 31-31v-104c0-17-14-31-31-31z m782 0h-104c-17 0-31 14-31 31v104c0 17 14 31 31 31h104c17 0 31-14 31-31v-104c0-17-14-31-31-31z m-452-592c8-9 20-9 28 0l144 153c8 8 5 16-6 16h-61c-11 0-19 7-19 18v164c64 9 142 35 142 104 0 2-1 3-1 5l-1 2-10 0c-8-78-182-80-202-80-20 0-194 2-202 80l-10 0 0-2c0-2 0-3 0-5 0-69 79-95 143-104v-164c0-11-11-18-22-18h-60c-11 0-14-8-7-16l144-153z m137 50v-150c0-29-23-52-52-52h-139c-29 0-52 23-52 52v150l38-36v-96c0-18 14-32 31-32h105c17 0 31 14 31 32v96l38 36z" horiz-adv-x="1000" />
<glyph glyph-name="group" unicode="&#xe804;" d="M82 842c-45 0-82-36-82-82v-110h192v192h-110z m53-134h-77v36c0 22 18 41 41 41h36v-77z m783 134h-110v-192h192v110c0 46-37 82-82 82z m24-134h-77v77h36c23 0 41-19 41-41v-36z m-942-658v-110c0-46 37-82 82-82h110v192h-192z m135-135h-36c-23 0-41 19-41 41v36h77v-77z m673 135v-192h110c45 0 82 36 82 82v110h-192z m134-94c0-22-18-41-41-41h-36v77h77v-36z m-883 126v536h75v-536h-75z m807 0v536h75v-536h-75z m-634 627v75h536v-75h-536z m0-793v75h536v-75h-536z m454 530h-92v71c0 46-37 82-82 82h-179c-45 0-82-36-82-82v-178c0-46 37-82 82-82h92v-72c0-45 37-82 82-82h179c45 0 82 37 82 82v179c0 45-37 82-82 82z m-261-82v-67h-84c-27 0-49 22-49 49v164c0 27 22 49 49 49h163c27 0 49-22 49-49v-64h-46c-45 0-82-37-82-82z m302-172c0-27-22-49-49-49h-164c-27 0-49 22-49 49v164c0 27 22 49 49 49h164c27 0 49-22 49-49v-163z" horiz-adv-x="1000" />
<glyph glyph-name="group-remote" unicode="&#xe805;" d="M82 842c-45 0-82-36-82-82v-110h192v192h-110z m53-134h-77v36c0 22 18 41 41 41h36v-77z m783 134h-110v-192h192v110c0 46-37 82-82 82z m24-134h-77v77h36c23 0 41-19 41-41v-36z m-942-658v-110c0-46 37-82 82-82h110v192h-192z m135-135h-36c-23 0-41 19-41 41v36h77v-77z m673 135v-192h110c45 0 82 36 82 82v110h-192z m134-94c0-22-18-41-41-41h-36v77h77v-36z m-211 433c-5 78-69 138-147 138-42 0-82-18-110-49-16 17-38 26-61 26-48 0-87-39-87-86l0-2c-4 1-7 1-11 1-67 0-122-55-122-122 0-67 55-122 122-122h384c60 0 110 50 110 111 0 49-32 91-78 105z m-32-158h-384c-86 0-75 143 11 127l68-13-10 68c-4 28 34 43 51 22l39-50 40 50c49 62 157 27 159-54l1-38 37-9c57-13 46-103-12-103z m-640-149v536h75v-536h-75z m882 0h-75v536h75v-536z m-709 627v75h536v-75h-536z m0-793v75h536v-75h-536z" horiz-adv-x="1000" />
<glyph glyph-name="label" unicode="&#xe806;" d="M670 157c2 4 5 7 8 11l322 321v-43l-303-303c-3-3-7-6-11-8l-36-18 20 40z m-225-271l315 93c7 2 13 6 18 11l222 222v83l-207-207c-3-3-5-5-6-8l-40-65c-5-8-12-14-21-17l-167-61-5 10c-15 33-41 59-74 75l-10 5 60 166c3 9 10 17 18 21l62 38c3 2 6 4 8 6l382 382v83l-475-473c-5-5-8-11-10-18l-96-320c-5-16 10-31 26-26z m160 712c40 0 70 18 70 41s-30 40-70 40h-535c-40 0-70-17-70-40s30-41 70-41h535z m-59-136c40 0 70 18 70 41s-30 41-70 41h-476c-40 0-70-18-70-41s30-41 70-41h476z m-228-135c40 0 70 17 70 40 0 24-30 41-70 41h-248c-40 0-70-17-70-40 0-24 30-41 70-41h248z m178 407c40 0 70 17 70 40s-30 41-70 41h-426c-40 0-70-17-70-41s30-40 70-40h426z" horiz-adv-x="1000" />
<glyph glyph-name="processor" unicode="&#xe807;" d="M101 832l-50-50-39-88 39 39v-120l-39-88 39 39v-120l-39-87 39 39v-121l-39-87 39 39v-121l-39-87 39 39v-121l-39-87 63 63h121l-15-63 63 63h121l-15-63 63 63h120l-14-63 63 63h120l-14-63 63 63h120l-15-63 114 113c11 12 18 28 18 44v760c0 46-37 83-83 83h-760c-16 0-32-7-44-18z m798-850h-738c-23 0-41 18-41 41v738c0 23 18 42 41 42h738c23 0 42-19 42-42v-738c0-23-19-41-42-41z m-119 564c-2 9-4 19-11 27-57 75-144 119-239 119-65 0-128-21-180-60-127-96-156-278-66-409 1-3 2-6 4-8 57-76 144-120 239-120 66 0 128 21 180 61 68 51 111 123 122 202 9 66-8 133-49 188z m-54-322c-39-30-87-45-137-45-80 0-157 40-208 106-11 15-28 24-46 24-13 0-25-4-36-12-12-10-20-23-23-39 0-4 1-7 1-11-60 110-39 246 55 317 39 29 86 45 136 45 80 0 158-40 208-107 11-15 28-23 47-23 13 0 25 4 35 11 16 13 23 32 22 51 63-110 42-245-54-317z" horiz-adv-x="1000" />
<glyph glyph-name="provenance" unicode="&#xe808;" d="M827 160v-258c0-29-23-52-51-52h-724c-29 0-52 23-52 52v724c0 28 23 51 52 51h258v-465c0-29 23-52 52-52h465z m-193 293c-17 0-31 14-31 31v271h-150c-17 0-31-13-31-30v-422c0-17 14-30 31-30h422c17 0 30 13 30 30v150h-271z m366 145v193c0 33-26 59-59 59h-193c-32 0-58-26-58-59v-193c0-32 26-58 58-58h193c33 0 59 26 59 58z m-241 183h172v-172h-172v172z" horiz-adv-x="1000" />
<glyph glyph-name="template" unicode="&#xe809;" d="M995 413v-157a31 31 0 0 0-31-31h-231l-195-156h153a31 31 0 0 0 32-31v-157a31 31 0 0 0-32-31h-434a31 31 0 0 0-31 31v157a31 31 0 0 0 31 31h231l196 156h-153a31 31 0 0 0-31 31v157a31 31 0 0 0 31 31h122l-373 187h-244a31 31 0 0 0-31 32v156a31 31 0 0 0 31 31h433a31 31 0 0 0 31-31v-156a31 31 0 0 0-31-32h-122l373-187h244a31 31 0 0 0 31-31z" horiz-adv-x="1000" />
<glyph glyph-name="transmit-false" unicode="&#xe80a;" d="M44 835l-44-44 163-163c-52-74-83-165-83-262 0-255 206-461 460-461 98 0 189 32 264 85l125-125 44 44-929 926z m287-374l60-60c-2-11-4-23-4-36 0-84 68-153 153-153 12 0 24 2 36 5l60-60c-29-14-62-22-96-22-127 0-230 103-230 230 0 35 8 67 21 96z m209-479c-212 0-383 172-383 383 0 77 23 148 62 208l55-55c-26-45-41-97-41-153 0-169 138-306 307-306 56 0 108 15 153 41l56-55c-60-40-132-63-209-63z m0 767c212 0 383-172 383-383 0-75-21-145-58-204l55-55v0c50 73 80 163 80 258 0 255-206 460-460 460-96 0-186-29-260-80l56-55c59 37 129 59 204 59z m269-531c24 44 38 94 38 148 0 169-138 306-307 306-54 0-104-14-148-38l57-57c28 12 59 18 91 18 127 0 230-102 230-230 0-32-7-62-18-90l57-57z m-299 298l180-180c2 10 3 19 3 30 0 84-68 153-153 153-10 0-20-1-30-3z" horiz-adv-x="1000" />
<glyph glyph-name="zoom-actual" unicode="&#xe80b;" d="M42-150c-23 0-42 19-42 42v916c0 23 19 42 42 42h83c23 0 42-19 42-42v-916c0-23-19-42-42-42h-83z m416 233c-22 0-41 19-41 42v108c0 23 19 42 41 42h84c23 0 41-19 41-42v-108c0-23-18-42-41-42h-84z m0 343c-22 0-41 18-41 41v108c0 23 19 42 41 42h84c23 0 41-19 41-42v-108c0-23-18-41-41-41h-84z m417-576c-23 0-42 19-42 42v916c0 23 19 42 42 42h83c23 0 42-19 42-42v-916c0-23-19-42-42-42h-83z" horiz-adv-x="1000" />
<glyph glyph-name="zoom-fit" unicode="&#xe80c;" d="M637 779c-12 12-15 30-9 45 7 16 22 26 39 26h291c23 0 42-19 42-42v-291c0-17-10-32-25-39-6-2-11-3-17-3-11 0-21 5-29 12l-292 292z m-566-292c-8-7-18-12-29-12-6 0-11 1-16 3-16 7-26 22-26 39v291c0 23 19 42 42 42h291c17 0 32-10 39-26 6-15 3-33-9-45l-292-292z m292-566c12-12 15-30 9-45-7-16-22-26-39-26h-291c-23 0-42 19-42 42v291c0 17 10 32 26 39 15 6 33 3 45-9l292-292z m566 292c12 12 30 15 46 9 15-7 25-22 25-39v-291c0-23-19-42-42-42h-291c-17 0-32 10-39 26-6 15-3 33 9 45l292 292z" horiz-adv-x="1000" />
<glyph glyph-name="label-add" unicode="&#xe80d;" d="M670 157a42 42 0 0 0 8 11l322 321v-43l-303-303a42 42 0 0 0-11-8l-36-17z m-65 441c40 0 70 18 70 41s-31 40-70 40h-535c-39 0-70-16-70-40s31-41 70-41h535z m-58-135c40 0 70 17 70 40s-32 41-70 41h-477c-39 0-70-18-70-41s31-40 70-40h477z m-51 271c40 0 70 17 70 40s-31 41-70 41h-426c-39 0-70-17-70-41s31-40 70-40h426z m-426-406h6a283 283 0 0 0 137 81h-143c-39-1-70-18-70-41s31-41 70-41z m214 40a234 234 0 1 1 234-234 234 234 0 0 1-234 234z m140-268a9 9 0 0 0-9-9h-81a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-66a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-80a9 9 0 0 0-9 9v66a9 9 0 0 0 9 9h81a9 9 0 0 1 10 9v82a9 9 0 0 0 7 8h65a9 9 0 0 0 9-9v-81a9 9 0 0 1 9-9h81a9 9 0 0 0 9-9v-66z m363-22l-40-64a42 42 0 0 0-21-18l-167-60-4 10a156 156 0 0 1-28 40 285 285 0 0 0-100-99 20 20 0 0 1 18-3l315 94a42 42 0 0 1 18 11l222 223v82l-207-206a42 42 0 0 1-6-8z m-250 182a281 281 0 0 0 17-43l56 34a42 42 0 0 1 8 6l382 383v83z" horiz-adv-x="1000" />
<glyph glyph-name="template-add" unicode="&#xe80e;" d="M723 38v-157a31 31 0 0 0-32-31h-406a283 283 0 0 1 276 219h132a31 31 0 0 0 30-31z m241 406h-244l-372 187h121a31 31 0 0 1 31 32v156a31 31 0 0 1-31 31h-433a31 31 0 0 1-31-31v-156a31 31 0 0 1 31-32h244l372-187h-121a31 31 0 0 1-31-31v-94a283 283 0 0 0 53-94h132l-117-94a284 284 0 0 0-5-43l170 137h231a31 31 0 0 1 31 31v157a31 31 0 0 1-31 31z m-446-310a234 234 0 1 0-234 234 234 234 0 0 0 234-234z m-94 32a9 9 0 0 1-9 9h-81a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-66a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-80a9 9 0 0 1-9-9v-66a9 9 0 0 1 9-9h81a9 9 0 0 0 10-9v-81a9 9 0 0 1 9-9h65a9 9 0 0 1 9 9v81a9 9 0 0 0 9 9h81a9 9 0 0 1 8 9v66z" horiz-adv-x="1000" />
<glyph glyph-name="group-add" unicode="&#xe80f;" d="M82 842a82 82 0 0 1-82-82v-110h192v192h-110z m53-134h-77v35a41 41 0 0 0 41 41h36v-76z m783 134h-110v-192h192v110a82 82 0 0 1-82 82z m24-134h-77v76h36a41 41 0 0 0 41-41v-35z m-134-657v-192h110a82 82 0 0 1 82 81v110h-192z m134-94a41 41 0 0 0-41-40h-36v76h77v-36z m-76 126v535h75v-536h-75z m-634 626v74h536v-75h-536z m536-719v-75h-302a285 285 0 0 1 62 75h240z m-485 375a234 234 0 1 1 235-234 234 234 0 0 1-234 237z m141-265a9 9 0 0 0-9-9h-81a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-66a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-80a9 9 0 0 0-9 9v66a9 9 0 0 0 9 9h81a9 9 0 0 1 10 9v82a9 9 0 0 0 7 8h65a9 9 0 0 0 9-9v-81a9 9 0 0 1 9-9h81a9 9 0 0 0 9-9v-66z m-365 206v312h75v-243a285 285 0 0 1-75-69z m709 58v-179a82 82 0 0 0-82-82h-120a286 286 0 0 1 1 31v10h111a49 49 0 0 1 49 50v162a49 49 0 0 1-49 49h-164a49 49 0 0 1-49-49v-6a284 284 0 0 1-38 27 82 82 0 0 0 80 67h46v66a49 49 0 0 1-49 49h-163a49 49 0 0 1-49-49v-94h-8a286 286 0 0 1-31-2v103a82 82 0 0 0 80 83h179a82 82 0 0 0 82-83v-72h92a82 82 0 0 0 82-81z" horiz-adv-x="1000" />
<glyph glyph-name="template-import" unicode="&#xe810;" d="M990 432v-153a31 31 0 0 0-31-31h-430a31 31 0 0 0-31 31v153a31 31 0 0 0 31 31h116l-361 172h-243a31 31 0 0 0-31 31v153a31 31 0 0 0 31 31h430a31 31 0 0 0 31-31v-153a31 31 0 0 0-31-32h-115l360-171h243a31 31 0 0 0 31-31z m-656-558h-113a63 63 0 0 0-57 38h-154v-31a31 31 0 0 1 31-31h474a31 31 0 0 1 31 31v31h-154a63 63 0 0 0-57-39z m-115 31h115a31 31 0 0 1 31 31v151a13 13 0 0 0 14 13h159c8 0 10 4 5 9l-256 259a13 13 0 0 1-19 0l-255-258c-5-5-3-10 4-10h159a13 13 0 0 0 14-13v-152a31 31 0 0 1 31-31z" horiz-adv-x="1000" />
<glyph glyph-name="template-save" unicode="&#xe811;" d="M990 432v-153a31 31 0 0 0-31-31h-430a31 31 0 0 0-31 31v153a31 31 0 0 0 31 31h116l-361 172h-243a31 31 0 0 0-31 31v153a31 31 0 0 0 31 31h430a31 31 0 0 0 31-31v-153a31 31 0 0 0-31-32h-115l360-171h243a31 31 0 0 0 31-31z m-508-560a22 22 0 0 0-22-22h-438a22 22 0 0 0-22 22v437a22 22 0 0 0 22 22h312a47 47 0 0 0 29-12l106-106a47 47 0 0 0 12-28v-313z m-40 18v286a25 25 0 0 1-7 15l-91 92a44 44 0 0 1-23 9v-139a22 22 0 0 0-22-22h-197a22 22 0 0 0-22 22v139h-40v-402h40v139a22 22 0 0 0 22 22h278a22 22 0 0 0 22-22v-139h40z m-81 0v121h-240v-121h241z m-80 402h-93v-121h71a22 22 0 0 1 22 23v98z" horiz-adv-x="1000" />
<glyph glyph-name="group-remote-add" unicode="&#xe812;" d="M82 842a82 82 0 0 1-82-82v-110h192v192h-110z m53-134h-77v35a41 41 0 0 0 41 41h36v-76z m783 134h-110v-192h192v110a82 82 0 0 1-82 82z m24-134h-77v76h36a41 41 0 0 0 41-41v-35z m-134-657v-192h110a82 82 0 0 1 82 81v110h-192z m134-94a41 41 0 0 0-41-40h-36v76h77v-36z m0 126h-75v535h75v-536z m-710 626v74h536v-75h-536z m536-719v-75h-302a285 285 0 0 1 62 75h240z m-485 375a234 234 0 1 1 235-234 234 234 0 0 1-234 237z m141-265a9 9 0 0 0-9-9h-81a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-66a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-80a9 9 0 0 0-9 9v66a9 9 0 0 0 9 9h81a9 9 0 0 1 10 9v82a9 9 0 0 0 7 8h65a9 9 0 0 0 9-9v-81a9 9 0 0 1 9-9h81a9 9 0 0 0 9-9v-66z m-365 206v312h75v-243a285 285 0 0 1-75-69z m750-22a111 111 0 0 0-111-111h-134a281 281 0 0 1-14 59h148a53 53 0 0 1 13 103l-37 9v38a91 91 0 0 1-160 53l-39-50-39 50a29 29 0 0 1-52-22l3-16a281 281 0 0 1-61 16v3a87 87 0 0 0 148 61 148 148 0 0 0 257-89 110 110 0 0 0 78-104z" horiz-adv-x="1000" />
<glyph glyph-name="port-out-add" unicode="&#xe813;" d="M284 368a234 234 0 1 1 234-234 234 234 0 0 1-234 234z m140-268a9 9 0 0 0-9-9h-81a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-66a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-80a9 9 0 0 0-9 9v66a9 9 0 0 0 9 9h81a9 9 0 0 1 10 9v82a9 9 0 0 0 7 8h65a9 9 0 0 0 9-9v-81a9 9 0 0 1 9-9h81a9 9 0 0 0 9-9v-66z m365 594v-102l-39 39v63a38 38 0 0 1-39 37h-615a38 38 0 0 1-38-37v-390a281 281 0 0 1-58-170v579l41 41a58 58 0 0 0 41 17h630a77 77 0 0 0 77-77z m205-421l-341-339c-9-8-16-6-16 7v192a22 22 0 0 1-22 22h-49a281 281 0 0 1-11 63h133a11 11 0 0 0 10-11v-132c0-6 4-7 8-3l212 209a11 11 0 0 1 0 15l-212 210c-4 5-8 3-8-3v-130a11 11 0 0 0-10-11h-208a11 11 0 0 1-11-12 283 283 0 0 1-63 40v10a22 22 0 0 0 22 22h188a22 22 0 0 1 22 21v194c0 11 6 15 15 6l341-339a22 22 0 0 0 0-31z" horiz-adv-x="1000" />
<glyph glyph-name="port-in-add" unicode="&#xe814;" d="M786 148h-54v276h54v-276z m-179 154l-353 351c-9 10-16 6-16-6v-200a23 23 0 0 0-22-23h-193a23 23 0 0 1-23-22v-231a22 22 0 0 1 2-8 281 281 0 0 0 62 149v38a11 11 0 0 0 11 11h39a281 281 0 0 0 170 57h18v88c0 7 3 8 8 4l218-217a11 11 0 0 0 0-15 281 281 0 0 0 27-60l53 52a23 23 0 0 1-1 32z m-323 66a234 234 0 1 1 234-234 234 234 0 0 1-234 234z m140-268a9 9 0 0 0-9-9h-81a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-66a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-80a9 9 0 0 0-9 9v66a9 9 0 0 0 9 9h81a9 9 0 0 1 10 9v82a9 9 0 0 0 7 8h65a9 9 0 0 0 9-9v-81a9 9 0 0 1 9-9h81a9 9 0 0 0 9-9v-66z m534 668a60 60 0 0 1-42 18h-671a63 63 0 0 1-62-63l41-40v22a40 40 0 0 0 40 40h637a40 40 0 0 0 39-40v-636a40 40 0 0 0-39-40h-354a281 281 0 0 0-31-60h463l21 21v735z" horiz-adv-x="1000" />
<glyph glyph-name="processor-add" unicode="&#xe815;" d="M988 767v-761a63 63 0 0 0-19-43l-113-113 15 62h-121l-62-62 14 62h-120l-63-62 15 62h-73a285 285 0 0 1 62 69h375a42 42 0 0 1 42 42v738a42 42 0 0 1-42 42h-737a42 42 0 0 1-42-42v-396a285 285 0 0 1-68-69v99l-39-38 39 87v120l-39-39 39 88v120l-39-39 39 88 50 50a63 63 0 0 0 44 18h760a83 83 0 0 0 83-83z m-469-634a234 234 0 1 0-234 235 234 234 0 0 0 233-234z m-94 32a9 9 0 0 1-9 9h-81a9 9 0 0 0-9 9v81a9 9 0 0 1-9 9h-67a9 9 0 0 1-9-9v-81a9 9 0 0 0-9-9h-80a9 9 0 0 1-9-9v-65a9 9 0 0 1 9-9h81a9 9 0 0 0 10-9v-81a9 9 0 0 1 9-9h65a9 9 0 0 1 9 9v81a9 9 0 0 0 9 9h81a9 9 0 0 1 8 9v66z m356 381a57 57 0 0 1-10 27 299 299 0 0 1-539-160l14 2a221 221 0 0 0 223 194 263 263 0 0 0 208-107 58 58 0 0 1 104 39 242 242 0 0 0-55-316 225 225 0 0 0-137-45 242 242 0 0 0-26 0 256 256 0 0 0 0-82 297 297 0 0 1 142 58 304 304 0 0 1 122 202 256 256 0 0 1-46 188z" horiz-adv-x="1000" />
<glyph glyph-name="lineage" unicode="&#xe816;" d="M785 405a214 214 0 0 1-83-17l-58 87a215 215 0 1 1-266-18l-82-184a215 215 0 1 1 72-31l82 185a210 210 0 0 1 127 8l59-90a215 215 0 1 1 149 60z m-539-438a98 98 0 1 0 98 98 98 98 0 0 0-98-98z m157 668a98 98 0 1 0 97-97 98 98 0 0 0-97 97z m382-543a98 98 0 1 0 98 98 98 98 0 0 0-98-98z" horiz-adv-x="1000" />
<glyph glyph-name="import-from-registry-add" unicode="&#xe81d;" d="M890 579c7 37 2 91-47 125-52 37-106 21-135 7-24 43-92 131-251 125-84-3-149-29-190-78-45-51-53-114-54-145-48-8-161-42-160-195 0-58 29-99 65-127 9 12 17 22 27 32-28 20-50 50-50 95-1 151 134 155 140 155h23l-3 22c0 0-7 77 43 134 34 39 88 61 160 64 177 7 219-115 220-120l10-27 23 17c0 0 57 40 108 5 49-35 27-98 25-100l-9-25 27-3c6 0 146-17 136-157-7-109-143-107-148-108h-121v-42h124c63 0 180 30 187 147 8 129-84 183-150 198v1z m-40-375h-179c-5 0-10 2-14 6-4 4-7 8-7 14v173c0 5-2 10-6 14-4 4-8 7-14 7h-207c-5 0-10-2-15-6-2-3-3-7-4-10 34-8 67-22 95-41h84c0 0 5-1 8-3 2-1 2-4 2-7v-101c15-32 25-67 27-103h103c6 0 8-3 4-8l-141-142c-23-41-56-76-96-101l23-23c4-3 9-5 14-5 5 0 10 2 14 5l314 316c0 0 6 8 4 10-1 3-4 4-10 4l1 1z m-506 164c-42 0-81-10-117-31-36-21-64-49-85-85-21-36-32-75-32-118 0-42 11-81 32-117 21-36 49-65 85-85 36-21 75-32 117-32 43 0 82 11 118 32 36 20 64 49 85 85 21 36 31 75 31 117 0 43-10 82-31 118-21 36-49 64-85 85-36 21-75 31-118 31z m140-268c0 0 0-5-2-7-2-1-4-2-7-2h-81c0 0-5-1-6-3-2-1-3-4-3-6v-81c0 0-1-5-2-7-2-2-5-2-7-2h-66c0 0-5 0-7 2-1 2-2 4-2 7v81c0 0 0 5-3 6-1 2-4 3-6 3h-80c0 0-5 1-7 2-2 2-2 5-2 7v66c0 0 0 5 2 7 2 1 4 2 7 2h81c0 0 5 0 6 3 2 1 4 4 4 6v82c0 5 3 7 6 8h65c0 0 5-1 7-2 2-2 2-4 2-7v-81c0 0 0-5 3-6 2-2 4-3 7-3h80c0 0 5-1 7-2 2-2 3-5 3-7v-66h1z" horiz-adv-x="1083" />
<glyph glyph-name="import-from-registry" unicode="&#xe81e;" d="M913 579c6 37 1 91-47 125-53 37-107 21-136 7-23 43-92 131-251 125-84-3-148-29-190-78-45-51-52-114-53-145-48-8-162-42-160-195 1-142 159-182 242-184h28v42h-28c-10 0-200 7-201 143-1 151 134 154 140 154h22l-2 23c0 0-7 77 42 134 34 39 89 61 161 63 177 8 218-114 220-119l9-27 24 16c0 0 57 41 108 5 49-34 27-97 25-100l-9-25 26-2c6 0 146-16 137-158-7-108-143-106-148-107h-121v-42h123c64 0 180 30 188 147 8 129-84 183-150 198h1z m-246-168c0 0 6-9 6-14v-173c0-5 1-10 6-14 4-4 9-6 14-6h180c5 0 8-1 10-4 0-2 0-6-5-10l-314-316c-4-3-9-5-14-5-5 0-10 2-14 5l-314 316c0 0-5 8-4 10 0 3 4 4 10 4h179c5 0 10 3 14 7 4 4 6 9 6 14v172c0 6 1 11 6 15 4 4 9 6 15 6h206c5 0 10-3 14-7h-1z m-174-50c0 0-5-1-8-3-2-3-2-5-2-8v-192c0 0-1-6-4-8-2-2-5-3-7-3h-121c-6 0-8-3-3-8l194-195c0 0 4-2 6-2 3 0 5 0 7 2l194 195c4 5 3 8-3 8h-119c0 0-6 1-8 3-2 3-3 5-3 8v193c0 0-1 5-3 7-1 3-4 3-7 3h-113z" horiz-adv-x="1083" />
<glyph glyph-name="port-in" unicode="&#xe832;" d="M1000-10v735l-42 43a60 60 0 0 1-42 18h-671a63 63 0 0 1-62-63l41-40v22a40 40 0 0 0 40 40h637a40 40 0 0 0 39-40v-636a40 40 0 0 0-39-40h-449l-60-60h587z m-1000 412v-231a23 23 0 0 1 23-23h192a23 23 0 0 0 23-22v-200c0-13 7-15 16-7l353 351a23 23 0 0 1 0 32l-353 351c-9 10-16 6-16-6v-200a23 23 0 0 0-22-23h-193a23 23 0 0 1-23-22z m63-52a11 11 0 0 0 11 11h216a11 11 0 0 1 12 12v133c0 7 3 8 8 4l218-217a11 11 0 0 0 0-15l-218-217c-5-4-8-3-8 4v135a11 11 0 0 1-12 12h-215a11 11 0 0 0-12 11v127z m722-201h-53v275h54v-276z" horiz-adv-x="1000" />
<glyph glyph-name="port-out" unicode="&#xe833;" d="M0 3v710l41 41a58 58 0 0 0 41 17h630a77 77 0 0 0 77-77v-102l-39 39v63a38 38 0 0 1-39 37h-615a38 38 0 0 1-38-37v-616a38 38 0 0 1 38-38h482v-58h-558z m653-69l341 339a22 22 0 0 1 0 31l-341 339c-9 9-16 6-16-6v-193a22 22 0 0 0-22-22h-187a22 22 0 0 1-22-22v-222a22 22 0 0 1 22-22h187a22 22 0 0 0 22-22v-193c0-13 7-16 16-7z m45 141v131a11 11 0 0 1-10 11h-208a11 11 0 0 0-11 11v122a11 11 0 0 0 11 11h208a11 11 0 0 1 10 11v130c0 6 4 7 8 3l212-209a11 11 0 0 0 0-15l-212-209c-4-3-8-3-8 3z m-467 347a127 127 0 0 1-118-134 127 127 0 0 1 118-133 127 127 0 0 1 119 133 127 127 0 0 1-119 134z m0-223a84 84 0 0 0-79 89 84 84 0 0 0 79 89 84 84 0 0 0 79-89 84 84 0 0 0-79-89z" horiz-adv-x="1000" />
<glyph glyph-name="connect" unicode="&#xe834;" d="M853 703a500 500 0 1 0-753-53 31 31 0 0 0 46 2l279-279a16 16 0 0 0 0-22l-93-94a8 8 0 0 1 3-13l332-74a8 8 0 0 1 9 9l-72 334a8 8 0 0 1-13 3l-94-93a16 16 0 0 0-22 0l-278 280a31 31 0 0 0 4 47 500 500 0 0 0 652-47z" horiz-adv-x="1000" />
<glyph glyph-name="connect-add" unicode="&#xe835;" d="M853 703a500 500 0 1 0-752-53 31 31 0 0 0 46 2l154-154a16 16 0 0 0 0-22l-94-94a8 8 0 0 1 4-13l333-73a8 8 0 0 1 9 10l-74 331a8 8 0 0 1-13 4l-94-94a16 16 0 0 0-22 0l-152 156a31 31 0 0 0 3 47 500 500 0 0 0 652-47z m-55-523a8 8 0 0 1 8 8v70a8 8 0 0 0 7 8h70a8 8 0 0 1 8 8v56a8 8 0 0 1-8 8h-70a8 8 0 0 0-8 8v70a8 8 0 0 1-8 8h-56a8 8 0 0 1-8-8v-70a8 8 0 0 0-8-8h-69a8 8 0 0 1-8-8v-56a8 8 0 0 1 8-8h71a8 8 0 0 0 7-8v-70a8 8 0 0 1 8-8h56z" horiz-adv-x="1000" />
<glyph glyph-name="threads" unicode="&#xe83f;" d="M308 350a149 149 0 1 0-149 149 149 149 0 0 0 149-149z m10 341a159 159 0 1 1-159-158 159 159 0 0 1 159 158z m-66 0a94 94 0 1 0-94 94 94 94 0 0 0 94-94z m248 149a149 149 0 1 1 149-149 149 149 0 0 1-149 149z m-182-831a159 159 0 1 1-159-159 159 159 0 0 1 159 159z m-66 0a94 94 0 1 0-94 94 94 94 0 0 0 94-94z m248 149a149 149 0 1 1 149-149 149 149 0 0 1-149 149z m341 0a149 149 0 1 1 149-149 149 149 0 0 1-149 149z m159 192a159 159 0 1 1-159-159 159 159 0 0 1 159 159z m-66 0a94 94 0 1 0-94 94 94 94 0 0 0 94-94z m66 341a159 159 0 1 1-159-158 159 159 0 0 1 159 158z m-66 0a94 94 0 1 0-94 94 94 94 0 0 0 94-94z m-434-192a149 149 0 1 1 149-149 149 149 0 0 1-149 149z" horiz-adv-x="1000" />
<glyph glyph-name="drop" unicode="&#xe888;" d="M507-38v104a8 8 0 0 0 8 8h104v-112h-112z m0-111a333 333 0 0 1 112 21v56h-104a8 8 0 0 1-8-8v-70z m237 236v112h-103a8 8 0 0 1-8-8v-103h111z m14-139a23 23 0 0 1 6 17v89h-111v-112h88a23 23 0 0 1 17 7z m-98-98a334 334 0 0 1 83 51h-83v-51z m174 238a332 332 0 0 1 22 111h-78v-111h56z m-28-126a333 333 0 0 1 50 83h-50v-83z m0 0a333 333 0 0 1 50 83h-50v-83z m21 258h-209a8 8 0 0 1-8-8v-117h-117a8 8 0 0 1-8-8v-209a342 342 0 0 0-341 343c0 162 127 318 214 432a1279 1279 0 0 1 125 195 4 4 0 0 0 7 0 1279 1279 0 0 1 125-195c85-114 212-270 212-432z m-489 326l-28 5a1143 1143 0 0 1-80-123 406 406 0 0 1-59-255 320 320 0 0 1 107-192 314 314 0 0 1 39-29 4 4 0 0 1 5 7 344 344 0 0 0-94 156 435 435 0 0 0 31 279 1210 1210 0 0 0 68 136z m72 138l-19-26c-20-28-41-55-62-82l24-3c18 29 36 58 53 86l14 25c3 7-6 6-10 0z" horiz-adv-x="1000" />
</font>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,19 +0,0 @@
Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -1,38 +0,0 @@
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
-moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
box-shadow: 2px 3px 5px rgba(0,0,0,.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
max-width: 19em;
overflow: hidden;
white-space: pre;
color: black;
cursor: pointer;
}
li.CodeMirror-hint-active {
background: #08f;
color: white;
}

View File

@ -1,318 +0,0 @@
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
}
.CodeMirror-scroll {
/* Set scrolling behaviour here */
overflow: auto;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror div.CodeMirror-cursor {
border-left: 1px solid black;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.CodeMirror.cm-fat-cursor div.CodeMirror-cursor {
width: auto;
border: 0;
background: #7e7;
}
.CodeMirror.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
}
@-moz-keyframes blink {
0% { background: #7e7; }
50% { background: none; }
100% { background: #7e7; }
}
@-webkit-keyframes blink {
0% { background: #7e7; }
50% { background: none; }
100% { background: #7e7; }
}
@keyframes blink {
0% { background: #7e7; }
50% { background: none; }
100% { background: #7e7; }
}
/* Can style cursor different in overwrite (non-insert) mode */
div.CodeMirror-overwrite div.CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-ruler {
border-left: 1px solid #ccc;
position: absolute;
}
/* DEFAULT THEME */
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
line-height: 1;
position: relative;
overflow: hidden;
background: white;
color: black;
}
.CodeMirror-scroll {
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actuall scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
padding-bottom: 30px;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
-moz-box-sizing: content-box;
box-sizing: content-box;
padding-bottom: 30px;
margin-bottom: -32px;
display: inline-block;
/* Hack to make IE7 behave */
*zoom:1;
*display:inline;
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
height: 100%;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto;
}
.CodeMirror-widget {}
.CodeMirror-wrap .CodeMirror-scroll {
overflow-x: hidden;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor {
position: absolute;
border-right: none;
width: 0;
}
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.cm-searching {
background: #ffa;
background: rgba(255, 255, 0, .4);
}
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }

View File

@ -1,118 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
Styles for the Nifi combo box.
*/
.combo {
color: #262626;
font-family: Roboto, sans-serif;
font-size: 13px;
padding:0 10px;
height: 30px;
line-height: 30px;
border: 1px solid #eaeef0;
}
.combo-options {
background: #fefefe;
color: #262626;
list-style: none;
border: 1px solid #004849;
box-shadow:0 3px 6px rgba(0,0,0,0.3);
z-index: 2000;
border-top: none;
font-size: 13px;
}
.combo-options .fa {
color: #004849;
}
.combo-open {
background: #fff !important;
border: 1px solid #004849 !important;
border-bottom: 1px solid #fff !important;
font-weight: bold;
color: #262626;
box-shadow:0 3px 6px rgba(0,0,0,0.3);
}
.combo .combo-arrow {
float: right;
width: 10px;
line-height: 30px;
}
.combo .combo-text {
float: left;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: calc(100% - 15px);
font-weight: normal;
}
div.selected-disabled-option {
font-style: italic;
color: #828282;
}
.combo-options ul > li {
height: 32px;
padding: 0px 10px;
}
.combo-options ul > li.disabled-option {
font-style: italic;
}
.combo-option-text {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
float: left;
height: 32px;
font-weight: normal;
line-height: 32px;
width: calc(100% - 15px);
}
.combo-option-special {
font-style: italic;
}
.combo-glass-pane {
position: absolute;
background: #E3E8EB;
opacity: 0.0;
left: 0px;
top: 0px;
right: 0px;
bottom: 0px;
z-index: 1999;
}
div.combo-nifi-tooltip {
border: 1px solid #454545;
background-color: #FFFFA3;
color: #454545;
}
div.combo-button-normal {
background-color: #eaeef0;
}

View File

@ -1,369 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* requires qtip plugin to be loaded first*/
/**
* Create a new combo box. The options are specified in the following
* format:
*
* {
* selectedOption: {
* value: 'option 2'
* },
* options: [{
* text: 'option 1',
* value: 'option 1',
* disabled: true,
* description: 'Option description...'
* }, {
* text: 'option 2',
* value: 'option 2',
* optionClass: 'my-style'
* }],
* maxHeight: 300,
* select: selectHandler
* }
*
* Options have a label (specified as the text property that is rendered
* to users) and a value which is not. Additionally, options can be marked
* as disabled. A disabled option cannot be selected by a user but may be
* programmatically selected (supporting the restoration of options that have
* become invalid). It is up to the developer to ensure that the selected
* option is not disabled.
*
* The optionClass option supports specifying a class to apply to the
* option element.
*/
/**
* jQuery plugin for a NiFi style combo box.
*
* @param {type} $
* @returns {undefined}
*/
(function ($) {
var isUndefined = function (obj) {
return typeof obj === 'undefined';
};
var isNull = function (obj) {
return obj === null;
};
var isDefinedAndNotNull = function (obj) {
return !isUndefined(obj) && !isNull(obj);
};
var isBlank = function (str) {
return isUndefined(str) || isNull(str) || str === '';
};
var selectOption = function (combo, text, value) {
var config = combo.data('options');
var comboText = combo.children('div.combo-text');
var selectedOption;
// attempt to match on value first
$.each(config.options, function (i, option) {
if (value === option.value) {
selectedOption = option;
return false;
}
});
// if no option values matched, try the text
if (isUndefined(selectedOption)) {
$.each(config.options, function (i, option) {
if (isUndefined(selectedOption)) {
selectedOption = option;
}
if (text === option.text) {
selectedOption = option;
}
});
}
// ensure we found the selected option
if (isDefinedAndNotNull(selectedOption)) {
comboText.removeClass('selected-disabled-option').attr('title', selectedOption.text).text(selectedOption.text).data('text', selectedOption.text);
// if the selected option is disabled show it
if (selectedOption.disabled === true) {
comboText.addClass('selected-disabled-option');
}
// store the selected option
combo.data('selected-option', selectedOption);
// fire a select event if applicable
if (isDefinedAndNotNull(config.select)) {
config.select.call(combo, selectedOption);
}
}
};
var methods = {
/**
* Initializes the combo box.
*
* @argument {object} options The options for the combo box
*/
init: function (options) {
return this.each(function () {
// ensure the options have been properly specified
if (isDefinedAndNotNull(options) &&
isDefinedAndNotNull(options.options)) {
// get the combo
var combo = $(this);
// clear any current contents, remote events, and store options
combo.empty().unbind().data('options', options);
// add a div to hold the text
$('<div class="combo-text"></div>').appendTo(combo);
// add hover effect and handle a combo click
combo.addClass('combo-button-normal pointer combo').hover(function () {
combo.removeClass('button-normal').addClass('combo-button-over');
}, function () {
combo.removeClass('button-over').addClass('combo-button-normal');
}).click(function (event) {
var comboConfigOptions = combo.data('options');
//add active styles
$(this).addClass('combo-open');
// determine the position of the element in question
var position = combo.offset();
// create the combo box options beneath it
var comboOptions = $('<div></div>').addClass('combo-options').css({
'position': 'absolute',
'left': position.left + 'px',
'top': (position.top + Math.round(combo.outerHeight()) - 1) + 'px',
'width': (Math.round(combo.outerWidth()) - 2) + 'px',
'overflow-y': 'auto'
});
// keep track of the overall height
var actualHeight = 0;
// set the max height if necessary
var maxHeight = -1;
if (isDefinedAndNotNull(comboConfigOptions.maxHeight)) {
maxHeight = parseInt(comboConfigOptions.maxHeight);
if (maxHeight > 0) {
comboOptions.css('max-height', maxHeight + 'px');
}
} else {
var windowHeight = $(window).height();
maxHeight = windowHeight - (position.top + Math.round(combo.outerHeight())) - 32;
comboOptions.css('max-height', maxHeight + 'px');
}
// create the list that will contain the options
var optionList = $('<ul></ul>').appendTo(comboOptions);
// process the options
$.each(comboConfigOptions.options, function (i, option) {
var optionText = $('<span class="combo-option-text"></span>').attr('title', option.text).text(option.text);
var optionValue = $('<span class="hidden"></span>').text(option.value);
// create each option
var optionElement = $('<li></li>').addClass(option.optionClass).append(optionText).append(optionValue).appendTo(optionList);
// this is option is enabled register appropriate listeners
if (option.disabled === true) {
optionElement.addClass('unset disabled-option');
} else {
optionElement.click(function () {
//remove active styles
$('.combo').removeClass('combo-open');
// select the option
selectOption(combo, option.text, option.value);
// click the glass pane which will hide the options
$('.combo-glass-pane').click();
}).hover(function () {
$(this).addClass('pointer').css('background', '#eaeef0');
}, function () {
$(this).removeClass('pointer').css('background', '#ffffff');
});
}
if (!isBlank(option.description)) {
$('<div style="float: right; line-height: 32px;" class="fa fa-question-circle"></div>').appendTo(optionElement).qtip({
content: option.description,
position: {
at: 'top center',
my: 'bottom center',
adjust: {
y: 5
}
},
style: {
classes: 'nifi-tooltip'
},
show: {
solo: true,
effect: function(offset) {
$(this).slideDown(100);
}
},
hide: {
effect: function(offset) {
$(this).slideUp(100);
}
}
}
);
} else {
optionText.css('width', '100%');
}
actualHeight += 16;
});
// show the glass pane to catch the click events
var comboGlassPane = $('<div class="combo-glass-pane"></div>').one('click', function () {
if (comboOptions.length !== 0) {
// clean up tooltips
comboOptions.find('.fa').each(function () {
var tip = $(this);
if (tip.data('qtip')) {
var api = tip.qtip('api');
api.destroy(true);
}
});
// remove the options
comboOptions.remove();
//remove active styles
$('.combo').removeClass('combo-open');
}
// remove the glass pane
$(this).remove();
});
// add the combo to the dom
$('body').append(comboOptions).append(comboGlassPane);
// stop the event propagation so the body click event isn't fired
event.stopPropagation();
});
// add the drop down arrow
$('<div class="combo-arrow fa fa-chevron-down"></div>').appendTo(combo);
// get the first option
var firstOption = null;
if (options.options.length > 0) {
firstOption = options.options[0];
}
// set the selection
if (isDefinedAndNotNull(options.selectedOption)) {
selectOption(combo, options.selectedOption.text, options.selectedOption.value);
} else if (isNull(firstOption)) {
selectOption(combo);
} else {
selectOption(combo, firstOption.text, firstOption.value);
}
}
});
},
/**
* Returns the selected option of the first matching element.
*/
getSelectedOption: function () {
var value;
this.each(function () {
value = $(this).data('selected-option');
return false;
});
return value;
},
/**
* Sets the selected option.
*
* @argument {object} option The option to select
*/
setSelectedOption: function (option) {
return this.each(function () {
selectOption($(this), option.text, option.value);
});
},
/**
* Sets whether the specified option is enabled or disabled.
*
* @param option
* @param enabled
*/
setOptionEnabled: function (option, enabled) {
return this.each(function () {
var combo = $(this);
var comboConfigOptions = combo.data('options');
$.each(comboConfigOptions.options, function (i, configOption) {
if (configOption.value === option.value) {
configOption.disabled = !enabled;
}
});
});
},
/**
* Destroys the combo.
*/
destroy: function () {
return this.each(function () {
$(this).empty().unbind().removeData();
// remove the options if open
$('div.combo-glass-pane').click();
});
},
/**
* Closes the combo.
*/
close: function () {
$('div.combo-glass-pane').click();
}
};
$.fn.combo = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else {
return methods.init.apply(this, arguments);
}
};
})(jQuery);

View File

@ -1,165 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Plugin to provide support for generating ellipsis. This plugin comprises
* a number of suggested techniques found on StackOverflow.
*
* @param {type} $
* @returns {undefined}
*/
(function ($) {
var entityMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;',
'/': '&#x2f;'
};
var escapeHtml = function (string) {
return String(string).replace(/[&<>"'\/]/g, function (s) {
return entityMap[s];
});
};
/**
* Inserts ellipsis in elements where the contents exceed the width. The
* original text is preserved in the title attribute of the element. The
* element should have the following css properties:
*
* overflow: hidden;
* white-space: nowrap;
* width: 50px (value must be set in 'px')
*
* If multiline is desired, add a 'multiline' class to the element.
*
* @param {type} addTooltip
*/
$.fn.ellipsis = function (addTooltip) {
addTooltip = (typeof addTooltip === 'undefined' || addTooltip === null) ? true : addTooltip;
// function for determining if the browser supports ellipsis via css
function supportsOverflowProperty() {
var s = document.documentElement.style;
return ('textOverflow' in s || 'OTextOverflow' in s);
}
function binarySearch(length, funct) {
var low = 0;
var high = length - 1;
var best = -1;
var mid;
while (low <= high) {
mid = ~~((low + high) / 2);
var result = funct(mid);
if (result < 0) {
high = mid - 1;
} else if (result > 0) {
low = mid + 1;
} else {
best = mid;
low = mid + 1;
}
}
return best;
}
// chain and process each matched element
return this.each(function () {
var element = $(this);
// preserve the original text in the title attribute
var text = element.text();
if (addTooltip) {
element.attr('title', text);
}
// determine if this is a multiline element
var multiline = element.hasClass('multiline');
// if its not multiline and the browser supports ellipsis via css, use it
if (!multiline && supportsOverflowProperty()) {
element.css({
'text-overflow': 'ellipsis',
'o-text-overflow': 'ellipsis'
});
} else {
// clone the element and add to the body - this addresses issues where
// the element may not have been added to the dom (causing its size and
// styles to be incorrect)
var cloneElement = $(this.cloneNode(true)).hide().appendTo('body');
// make a scratch element to adjusting the text size
var scratchElement = $(this.cloneNode(true)).hide().css({
'position': 'absolute',
'overflow': 'visible'
}).width(multiline ? cloneElement.width() : 'auto').height(multiline ? 'auto' : cloneElement.height()).appendTo('body');
// function for determining if the scratch element is too tall
var isTooTall = function () {
return scratchElement.height() >= cloneElement.height();
};
// function for determining if the scratch element is too wide
var isTooWide = function () {
return scratchElement.width() >= cloneElement.width();
};
// determine the appropriate function to use
var isTooBig = multiline ? isTooTall : isTooWide;
// if the text is too big, adjust it accordingly
if (isTooBig()) {
var originalText = escapeHtml(text);
// function for creating the text within the scratch element
var createContent = function (i) {
var t = originalText.substr(0, i);
scratchElement.html(t + '&#8230;');
};
// function for performing the search
var search = function (i) {
createContent(i);
if (isTooBig()) {
return -1;
}
return 0;
};
// determine the appropriate length
var length = binarySearch(originalText.length - 1, search);
// create the content at the appropriate length
createContent(length);
}
// update the actual elements value
element.html(scratchElement.html());
// remove the cloned and scratch elements
cloneElement.remove();
scratchElement.remove();
}
});
};
})(jQuery);

View File

@ -1,69 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Plugin to support entering tab characters into textarea's or textfield's.
* Code heavily borrowed from stackoverflow post by user tim-down
* (http://stackoverflow.com/questions/4379535/tab-within-a-text-area-without-changing-focus-jquery/4380032#4380032)
*/
(function ($) {
/**
* Adds key listeners for capturing tab keys.
*/
function allowTabChar(element) {
$(element).keydown(function (e) {
if (e.which == 9) {
if (e.shiftKey == false && e.ctrlKey == false) {
insertText(this, '\t');
}
return false;
}
}).keypress(function (e) {
if (e.which == 9) {
return false;
}
});
}
/**
* Inserts the specified text into the specified element.
*/
function insertText(element, text) {
element.focus();
if (typeof element.selectionStart == 'number') {
var value = element.value;
var selectionStart = element.selectionStart;
element.value = value.slice(0, selectionStart) + text + value.slice(element.selectionEnd);
element.selectionEnd = element.selectionStart = selectionStart + text.length;
} else if (typeof document.selection != 'undefined') {
var textRange = document.selection.createRange();
textRange.text = text;
textRange.collapse(false);
textRange.select();
}
}
$.fn.tab = function () {
return this.each(function () {
if (this.nodeType == 1) {
var nodeName = this.nodeName.toLowerCase();
if (nodeName == 'textarea' || (nodeName == 'input' && this.type == 'text')) {
allowTabChar(this);
}
}
});
}
})(jQuery);

View File

@ -1,111 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
Styles for the Nifi dialog.
*/
.dialog {
background-color: #ffffff;
box-shadow: 0 5px 8px rgba(0,0,0,0.30);
overflow: hidden;
position: absolute;
top: 0px;
left: 0px;
}
.small-dialog {
max-height: 32%;
max-width: 23%;
min-height: 250px;
min-width: 320px;
font-size: 13px;
line-height: 1.3;
}
.medium-dialog {
max-height: 55%;
max-width: 34%;
min-height: 420px;
min-width: 470px;
}
.medium-short-dialog {
max-height: 32%;
max-width: 34%;
min-height: 250px;
min-width: 440px;
font-size: 13px;
line-height: 1.3;
}
.large-dialog {
max-height: 72%;
max-width: 55%;
min-height: 560px;
min-width: 760px;
}
.modal-glass {
position: absolute;
left: 0px;
top: 0px;
right: 0px;
bottom: 0px;
opacity: 0.65;
}
.dialog-header {
height: 56px;
background-color: #728E9B;
overflow: hidden;
color: #fff;
font-size: 18px;
font-family: 'Roboto Slab';
font-style: normal;
font-weight: bold;
text-overflow: ellipsis;
line-height: 56px;
padding: 0 20px;
white-space: nowrap;
}
.dialog-header-subtitle {
font-size: 12px;
font-weight: normal;
padding-left: 10px;
margin-left: 10px;
}
.dialog-header-subtitle:not(:empty) {
border-left: 1px solid white;
}
.dialog-content {
position: absolute;
top: 76px;
bottom: 52px;
left: 20px;
right: 20px;
overflow-y: auto;
word-wrap: break-word;
}
.dialog-buttons {
position: absolute;
bottom: 0;
width: 100%;
height: 32px;
}

View File

@ -1,588 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Create a new dialog.
*
* If the height, width, and fullscreen breakpoints options are not set this plugin will look for (and use)
* any CSS defined styles for height, min/max-height, width, min/max-width. If no CSS styles are defined then the
* plugin will attempt to calculate these values when the dialog is first opened (based on screen size).
*
* The options are specified in the following format:
*
* {
* header: true,
* footer: true,
* headerText: 'Dialog Header',
* subtitleText: 'Dialog subtitle',
* scrollableContentStyle: 'scrollable',
* buttons: [{
* buttonText: 'Cancel',
* color: {
* base: '#728E9B',
* hover: '#004849',
* text: '#ffffff'
* },
* disabled: isDisabledFunction,
* handler: {
* click: cancelHandler
* }
* }, {
* buttonText: 'Apply',
* color: {
* base: '#E3E8EB',
* hover: '#C7D2D7',
* text: '#004849'
* },
* disabled: isDisabledFunction,
* handler: {
* click: applyHandler
* }
* }],
* handler: {
* close: closeHandler,
* open: openHandler,
* resize: resizeHandler
* },
* height: "55%", //optional. Property can also be set with css (accepts 'px' or '%' values)
* width: "34%", //optional. Property can also be set with css (accepts 'px' or '%' values)
* min-height: "420px", //optional, defaults to 'height'. Property can also be set with css (accepts 'px' values)
* min-width: "470px" //optional, defaults to 'width'. Property can also be set with css (accepts 'px' values)
* responsive: {
* x: "true", //optional, default true
* y: "true", //optional, default true
* fullscreen-height: "420px", //optional, default is original dialog height (accepts 'px' values)
* fullscreen-width: "470px", //optional, default is original dialog width (accepts 'px' values)
* },
* glasspane: "#728E9B" //optional, sets the color of modal glasspane...default if unset is the dialog header color
* }
*
* The content of the dialog MUST be contained in an element with the class `dialog-content`
* directly under the dialog element.
*
* <div id="dialogId">
* <div class="dialog-content">
* //Dialog Content....
* </div>
* </div>
*
* @argument {jQuery} $
*/
(function ($) {
var isUndefined = function (obj) {
return typeof obj === 'undefined';
};
var isNull = function (obj) {
return obj === null;
};
var isDefinedAndNotNull = function (obj) {
return !isUndefined(obj) && !isNull(obj);
};
var isBlank = function (str) {
return isUndefined(str) || isNull(str) || str === '';
};
// private function for adding buttons
var addButtons = function (dialog, buttonModel) {
if (isDefinedAndNotNull(buttonModel)) {
var buttonWrapper = $('<div class="dialog-buttons"></div>');
$.each(buttonModel, function (i, buttonConfig) {
var isDisabled = function () {
return typeof buttonConfig.disabled === 'function' && buttonConfig.disabled.call() === true;
};
// create the button
var button = $('<div class="button"></div>').append($('<span></span>').text(buttonConfig.buttonText));
// add the class if specified
if (isDefinedAndNotNull(buttonConfig.clazz)) {
button.addClass(buttonConfig.clazz);
}
// set the color if specified
if (isDefinedAndNotNull(buttonConfig.color)) {
button.css({
'background': buttonConfig.color.base,
'color': buttonConfig.color.text
});
}
// check if the button should be disabled
if (isDisabled()) {
button.addClass('disabled-button');
} else {
// enable custom hover if specified
if (isDefinedAndNotNull(buttonConfig.color)) {
button.hover(function () {
$(this).css("background-color", buttonConfig.color.hover);
}, function () {
$(this).css("background-color", buttonConfig.color.base);
});
}
button.click(function () {
var handler = $(this).data('handler');
if (isDefinedAndNotNull(handler) && typeof handler.click === 'function') {
handler.click.call(dialog);
}
});
}
// add the button to the wrapper
button.data('handler', buttonConfig.handler).appendTo(buttonWrapper);
});
// store the button model to refresh later
dialog.append(buttonWrapper).data('buttonModel', buttonModel);
}
};
var methods = {
/**
* Initializes the dialog.
*
* @argument {object} options The options for the plugin
*/
init: function (options) {
return this.each(function () {
// get the combo
var dialog = $(this).addClass('dialog cancellable modal');
dialog.css('display', 'none');
var nfDialogData = {};
if (isDefinedAndNotNull(dialog.data('nf-dialog'))) {
nfDialogData = dialog.data('nf-dialog');
}
// ensure the options have been properly specified
if (isDefinedAndNotNull(options)) {
$.extend(nfDialogData, options);
//persist data attribute
dialog.data('nfDialog', nfDialogData);
}
// determine if dialog needs a header
if (!isDefinedAndNotNull(nfDialogData.header) || nfDialogData.header) {
var dialogHeaderText = $('<span class="dialog-header-text"></span>');
var dialogHeader = $('<div class="dialog-header"></div>').prepend(dialogHeaderText);
// determine if the specified header text is null
if (!isBlank(nfDialogData.headerText)) {
dialogHeaderText.text(nfDialogData.headerText);
}
$('<span></span>').addClass("dialog-header-subtitle").text(nfDialogData.subtitleText).appendTo(dialogHeader);
dialog.prepend(dialogHeader);
}
// determine if dialog needs footer/buttons
if (!isDefinedAndNotNull(nfDialogData.footer) || nfDialogData.footer) {
// add the buttons
addButtons(dialog, nfDialogData.buttons);
}
});
},
/**
* Sets the handler that is used when the dialog is closed.
*
* @argument {function} handler The function to call when hiding the dialog
*/
setCloseHandler: function (handler) {
return this.each(function (index, dialog) {
var nfDialogData = {};
if (isDefinedAndNotNull($(this).data('nf-dialog'))) {
nfDialogData = $(dialog).data('nf-dialog');
}
if (!isDefinedAndNotNull(nfDialogData.handler)){
nfDialogData.handler = {};
}
nfDialogData.handler.close = handler;
//persist data attribute
$(dialog).data('nfDialog', nfDialogData);
});
},
/**
* Sets the handler that is used when the dialog is opened.
*
* @argument {function} handler The function to call when showing the dialog
*/
setOpenHandler: function (handler) {
return this.each(function (index, dialog) {
var nfDialogData = {};
if (isDefinedAndNotNull($(this).data('nf-dialog'))) {
nfDialogData = $(dialog).data('nf-dialog');
}
if (!isDefinedAndNotNull(nfDialogData.handler)){
nfDialogData.handler = {};
}
nfDialogData.handler.open = handler;
//persist data attribute
$(dialog).data('nfDialog', nfDialogData);
});
},
/**
* Sets the handler that is used when the dialog is resized.
*
* @argument {function} handler The function to call when resizing the dialog
*/
setResizeHandler: function (handler) {
return this.each(function (index, dialog) {
var nfDialogData = {};
if (isDefinedAndNotNull($(this).data('nf-dialog'))) {
nfDialogData = $(dialog).data('nf-dialog');
}
if (!isDefinedAndNotNull(nfDialogData.handler)){
nfDialogData.handler = {};
}
nfDialogData.handler.resize = handler;
//persist data attribute
$(dialog).data('nfDialog', nfDialogData);
});
},
/**
* Updates the button model for the selected dialog.
*
* @argument {array} buttons The new button model
*/
setButtonModel: function (buttons) {
return this.each(function () {
if (isDefinedAndNotNull(buttons)) {
var dialog = $(this);
// remove the current buttons
dialog.children('.dialog-buttons').remove();
// add the new buttons
addButtons(dialog, buttons);
}
});
},
/**
* Refreshes the buttons with the existing model.
*/
refreshButtons: function () {
return this.each(function () {
var dialog = $(this);
var buttons = dialog.data('buttonModel');
// remove the current buttons
dialog.children('.dialog-buttons').remove();
// add the new buttons
addButtons(dialog, buttons);
});
},
/**
* Sets the header text of the dialog.
*
* @argument {string} text Text to use a as a header
*/
setHeaderText: function (text) {
return this.each(function () {
$(this).find('span.dialog-header-text').text(text);
});
},
setSubtitle: function (text) {
return this.each(function () {
$(this).find('span.dialog-header-subtitle').text(text);
});
},
resize: function () {
var dialog = $(this);
var dialogContent = dialog.find('.dialog-content');
var nfDialogData = {};
if (isDefinedAndNotNull(dialog.data('nf-dialog'))) {
nfDialogData = dialog.data('nf-dialog');
}
//initialize responsive properties
if (!isDefinedAndNotNull(nfDialogData.responsive)) {
nfDialogData.responsive = {};
if (!isDefinedAndNotNull(nfDialogData.responsive.x)) {
nfDialogData.responsive.x = true;
}
if (!isDefinedAndNotNull(nfDialogData.responsive.y)) {
nfDialogData.responsive.y = true;
}
} else {
if (!isDefinedAndNotNull(nfDialogData.responsive.x)) {
nfDialogData.responsive.x = true;
} else {
nfDialogData.responsive.x = (nfDialogData.responsive.x == "true" || nfDialogData.responsive.x == true) ? true : false;
}
if (!isDefinedAndNotNull(nfDialogData.responsive.y)) {
nfDialogData.responsive.y = true;
} else {
nfDialogData.responsive.y = (nfDialogData.responsive.y == "true" || nfDialogData.responsive.y == true) ? true : false;
}
}
if (nfDialogData.responsive.y || nfDialogData.responsive.x) {
var fullscreenHeight;
var fullscreenWidth;
if (isDefinedAndNotNull(nfDialogData.responsive['fullscreen-height'])) {
fullscreenHeight = parseInt(nfDialogData.responsive['fullscreen-height'], 10);
} else {
nfDialogData.responsive['fullscreen-height'] = dialog.height() + 'px';
fullscreenHeight = parseInt(nfDialogData.responsive['fullscreen-height'], 10);
}
if (isDefinedAndNotNull(nfDialogData.responsive['fullscreen-width'])) {
fullscreenWidth = parseInt(nfDialogData.responsive['fullscreen-width'], 10);
} else {
nfDialogData.responsive['fullscreen-width'] = dialog.width() + 'px';
fullscreenWidth = parseInt(nfDialogData.responsive['fullscreen-width'], 10);
}
if (!isDefinedAndNotNull(nfDialogData.width)) {
nfDialogData.width = dialog.css('width');
}
if (!isDefinedAndNotNull(nfDialogData['min-width'])) {
if (parseInt(dialog.css('min-width'), 10) > 0) {
nfDialogData['min-width'] = dialog.css('min-width');
} else {
nfDialogData['min-width'] = nfDialogData.width;
}
}
//min-width should always be set in terms of px
if (nfDialogData['min-width'].indexOf("%") > 0) {
nfDialogData['min-width'] = ($(window).width() * (parseInt(nfDialogData['min-width'], 10) / 100)) + 'px';
}
if (!isDefinedAndNotNull(nfDialogData.height)) {
nfDialogData.height = dialog.css('height');
}
if (!isDefinedAndNotNull(nfDialogData['min-height'])) {
if (parseInt(dialog.css('min-height'), 10) > 0) {
nfDialogData['min-height'] = dialog.css('min-height');
} else {
nfDialogData['min-height'] = nfDialogData.height;
}
}
//min-height should always be set in terms of px
if (nfDialogData['min-height'].indexOf("%") > 0) {
nfDialogData['min-height'] = ($(window).height() * (parseInt(nfDialogData['min-height'], 10) / 100)) + 'px';
}
//resize dialog
if ($(window).height() < fullscreenHeight) {
if (nfDialogData.responsive.y) {
dialog.css('height', '100%');
dialog.css('min-height', '100%');
}
} else {
//set the dialog min-height
dialog.css('min-height', nfDialogData['min-height']);
if (nfDialogData.responsive.y) {
//make sure nfDialogData.height is in terms of %
if (nfDialogData.height.indexOf("px") > 0) {
nfDialogData.height = (parseInt(nfDialogData.height, 10) / $(window).height() * 100) + '%';
}
dialog.css('height', nfDialogData.height);
}
}
if ($(window).width() < fullscreenWidth) {
if (nfDialogData.responsive.x) {
dialog.css('width', '100%');
dialog.css('min-width', '100%');
}
} else {
//set the dialog width
dialog.css('min-width', nfDialogData['min-width']);
if (nfDialogData.responsive.x) {
//make sure nfDialogData.width is in terms of %
if (nfDialogData.width.indexOf("px") > 0) {
nfDialogData.width = (parseInt(nfDialogData.width, 10) / $(window).width() * 100) + '%';
}
dialog.css('width', nfDialogData.width);
}
}
dialog.center();
//persist data attribute
dialog.data('nfDialog', nfDialogData);
}
//apply scrollable style if applicable
if (dialogContent[0].offsetHeight < dialogContent[0].scrollHeight) {
// your element has overflow
if (isDefinedAndNotNull(nfDialogData.scrollableContentStyle)) {
dialogContent.addClass(nfDialogData.scrollableContentStyle);
}
} else {
// your element doesn't have overflow
if (isDefinedAndNotNull(nfDialogData.scrollableContentStyle)) {
dialogContent.removeClass(nfDialogData.scrollableContentStyle);
}
}
if (isDefinedAndNotNull(nfDialogData.handler)) {
var handler = nfDialogData.handler.resize;
if (isDefinedAndNotNull(handler) && typeof handler === 'function') {
// invoke the handler
handler.call(dialog);
}
}
},
/**
* Shows the dialog.
*/
show: function () {
var dialog = $(this);
var zIndex = dialog.css('z-index');
if (zIndex === 'auto') {
if (isDefinedAndNotNull(dialog.data('nf-dialog'))) {
zIndex = (isDefinedAndNotNull(dialog.data('nf-dialog')['z-index'])) ?
dialog.data('nf-dialog')['z-index'] : 1301;
} else {
zIndex = 1301;
}
}
var openDialogs = $.makeArray($('.dialog:visible'));
if (openDialogs.length >= 1){
var zVals = openDialogs.map(function(openDialog){
var index;
return isNaN(index = parseInt($(openDialog).css("z-index"), 10)) ? 0 : index;
});
//Add 2 so that we have room for the glass pane overlay of the new dialog
zIndex = Math.max.apply(null, zVals) + 2;
}
dialog.css('z-index', zIndex);
var nfDialogData = {};
if (isDefinedAndNotNull(dialog.data('nf-dialog'))) {
nfDialogData = dialog.data('nf-dialog');
}
var glasspane;
if (isDefinedAndNotNull(nfDialogData.glasspane)) {
glasspane = nfDialogData.glasspane;
} else {
nfDialogData.glasspane = glasspane = dialog.find('.dialog-header').css('background-color'); //default to header color
}
if(top !== window || !isDefinedAndNotNull(nfDialogData.glasspane)) {
nfDialogData.glasspane = glasspane = 'transparent';
}
if (!$('body').find("[data-nf-dialog-parent='" + dialog.attr('id') + "']").is(':visible')) {
//create glass pane overlay
$('<div></div>').attr('data-nf-dialog-parent', dialog.attr('id')).addClass("modal-glass").css({
"background-color": glasspane,
"z-index": zIndex - 1
}).appendTo($('body'));
}
//persist data attribute
dialog.data('nfDialog', nfDialogData);
return this.each(function () {
// show the dialog
if (!dialog.is(':visible')) {
dialog.show();
dialog.modal('resize');
dialog.center();
if (isDefinedAndNotNull(nfDialogData.handler)) {
var handler = nfDialogData.handler.open;
if (isDefinedAndNotNull(handler) && typeof handler === 'function') {
// invoke the handler
handler.call(dialog);
}
}
}
});
},
/**
* Hides the dialog.
*/
hide: function () {
return this.each(function () {
var dialog = $(this);
var nfDialogData = {};
if (isDefinedAndNotNull(dialog.data('nf-dialog'))) {
nfDialogData = dialog.data('nf-dialog');
}
if (isDefinedAndNotNull(nfDialogData.handler)) {
var handler = nfDialogData.handler.close;
if (isDefinedAndNotNull(handler) && typeof handler === 'function') {
// invoke the handler
handler.call(dialog);
}
}
// remove the modal glass pane overlay
$('body').find("[data-nf-dialog-parent='" + dialog.attr('id') + "']").remove();
if (dialog.is(':visible')) {
// hide the dialog
dialog.hide();
}
});
}
};
$.fn.modal = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else {
return methods.init.apply(this, arguments);
}
};
})(jQuery);

View File

@ -1,80 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
CodeMirror styles
*/
.nf-editor .CodeMirror {
height: 100px;
border: 1px solid #aaa;
font-family: monospace;
background-color: #fff;
cursor: default;
line-height: normal;
min-width: 210px;
}
.nf-editor .CodeMirror.blank {
background: #b2b8c1;
color: #dbdee2;
border: 1px solid #b2b8c1;
}
.nf-editor .CodeMirror-scroll {
overflow-x: auto;
overflow-y: auto;
}
.nf-editor .ui-resizable-se {
width: 16px;
height: 16px;
background-image: url(../../../images/iconResize.png);
z-index: 6;
}
/*
Override some defaults...
*/
.CodeMirror-hints {
font-size: 13px !important;
z-index: 100001 !important;
}
.cm-s-default {
font-size: 13px;
font-family: monospace;
}
.cm-s-default .CodeMirror-matchingbracket {
color: #000 !important;
background-color: #aaa;
opacity: 0.5;
filter: alpha(opacity=50);
}
/*
Override some defaults for this instance...
*/
.nf-editor .CodeMirror-vscrollbar {
bottom: 18px !important;
}
.nf-editor .CodeMirror-hscrollbar {
right: 18px !important;
}

View File

@ -1,355 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* global define, module, require, exports */
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery',
'CodeMirror',
'nf'],
function ($, CodeMirror, nf) {
factory($, CodeMirror, nf);
});
} else if (typeof exports === 'object' && typeof module === 'object') {
factory(require('jquery'),
require('CodeMirror'),
require('nf'));
} else {
factory(root.$,
root.CodeMirror,
root.nf);
}
}(this, function ($, CodeMirror, nf) {
var isUndefined = function (obj) {
return typeof obj === 'undefined';
};
var isNull = function (obj) {
return obj === null;
};
var isDefinedAndNotNull = function (obj) {
return !isUndefined(obj) && !isNull(obj);
};
var isBlank = function (str) {
return isUndefined(str) || isNull(str) || str === '';
};
var isFunction = function (funct) {
return typeof funct === 'function';
};
var methods = {
/**
* Create a new nf editor. The options are specified in the following
* format:
*
* {
* languageMode: nf.nfel,
* resizable: true,
* sensitive: false,
* readOnly: false,
* content: '${attribute}',
* width: 200,
* height: 200,
* minWidth: 150,
* minHeight: 150
* }
*
* @param {object} options The options for this editor.
*/
init: function (options) {
return this.each(function () {
if (isUndefined(options) || isNull(options)) {
return false;
}
var languageMode = options.languageMode;
if (isUndefined(languageMode) || isNull(languageMode)) {
return false;
}
// should support resizing
var resizable = options.resizable === true;
// is the property sensitive
var sensitive = options.sensitive === true;
var content = isDefinedAndNotNull(options.content) ? options.content : '';
var field = $('<textarea></textarea>').text(content).appendTo($(this));
// define a mode for NiFi expression language
if (isFunction(languageMode.color)) {
CodeMirror.commands.autocomplete = function (cm) {
if (isFunction(languageMode.suggest)) {
CodeMirror.showHint(cm, languageMode.suggest);
}
};
CodeMirror.defineMode(languageMode.getLanguageId(), languageMode.color);
// is the editor read only
var readOnly = options.readOnly === true;
var editor = CodeMirror.fromTextArea(field.get(0), {
mode: languageMode.getLanguageId(),
lineNumbers: true,
matchBrackets: true,
readOnly: readOnly,
extraKeys: {
'Ctrl-Space': 'autocomplete',
'Esc': function (cm) {
if (isFunction(options.escape)) {
options.escape();
}
},
'Enter': function (cm) {
if (isFunction(options.enter)) {
options.enter();
}
}
}
});
// set the size
var width = null;
if (isDefinedAndNotNull(options.width)) {
width = options.width;
}
var height = null;
if (isDefinedAndNotNull(options.height)) {
height = options.height;
}
editor.setSize(width, height);
// store the editor instance for later
$(this).data('editorInstance', editor);
// get a reference to the codemirror
var codeMirror = $(this).find('.CodeMirror');
// reference the code portion
var code = codeMirror.find('.CodeMirror-code');
// make this resizable if specified
if (resizable) {
codeMirror.append('<div class="ui-resizable-handle ui-resizable-se"></div>').resizable({
handles: {
'se': '.ui-resizable-se'
},
resize: function () {
editor.setSize($(this).width(), $(this).height());
editor.refresh();
}
});
}
// handle keydown to signify the content has changed
editor.on('change', function (cm, event) {
codeMirror.addClass('modified');
});
// handle keyHandled to stop event propagation/default as necessary
editor.on('keyHandled', function (cm, name, evt) {
if (name === 'Esc') {
// stop propagation of the escape event
evt.stopImmediatePropagation();
evt.preventDefault();
}
});
// handle sensitive values differently
if (sensitive) {
code.addClass('sensitive');
var handleSensitive = function (cm, event) {
if (code.hasClass('sensitive')) {
code.removeClass('sensitive');
editor.setValue('');
}
};
// remove the sensitive style if necessary
editor.on('mousedown', handleSensitive);
editor.on('keydown', handleSensitive);
}
// set the min width/height
if (isDefinedAndNotNull(options.minWidth)) {
codeMirror.resizable('option', 'minWidth', options.minWidth);
}
if (isDefinedAndNotNull(options.minHeight)) {
codeMirror.resizable('option', 'minHeight', options.minHeight);
}
}
});
},
/**
* Refreshes the editor.
*/
refresh: function () {
return this.each(function () {
var editor = $(this).data('editorInstance');
// ensure the editor was initialized
if (isDefinedAndNotNull(editor)) {
editor.refresh();
}
});
},
/**
* Sets the size of the editor.
*
* @param {integer} width
* @param {integer} height
*/
setSize: function (width, height) {
return this.each(function () {
var editor = $(this).data('editorInstance');
// ensure the editor was initialized
if (isDefinedAndNotNull(editor)) {
editor.setSize(width, height);
}
});
},
/**
* Sets whether the editor is read only.
*
* @param {boolean|string} readOnly
*/
setReadOnly: function (readOnly) {
return this.each(function () {
var editor = $(this).data('editorInstance');
// ensure the editor was initialized
if (isDefinedAndNotNull(editor)) {
editor.setOption('readOnly', readOnly);
if (readOnly === false) {
$(this).find('.CodeMirror').removeClass('blank');
} else {
$(this).find('.CodeMirror').addClass('blank');
}
}
});
},
/**
* Gets the value of the editor in the first matching selector.
*/
getValue: function () {
var value;
this.each(function () {
var editor = $(this).data('editorInstance');
// ensure the editor was initialized
if (isDefinedAndNotNull(editor)) {
value = editor.getValue();
}
return false;
});
return value;
},
/**
* Sets the value of the editor.
*
* @param {string} value
*/
setValue: function (value) {
return this.each(function () {
var editor = $(this).data('editorInstance');
// ensure the editor was initialized
if (isDefinedAndNotNull(editor)) {
editor.setValue(value);
// remove the modified marking since the value was reset
$(this).find('.CodeMirror').removeClass('modified');
}
});
},
/**
* Sets the focus.
*/
focus: function () {
return this.each(function () {
var editor = $(this).data('editorInstance');
// ensure the editor was initialized
if (isDefinedAndNotNull(editor)) {
editor.focus();
}
});
},
/**
* Sets the focus.
*/
selectAll: function () {
return this.each(function () {
var editor = $(this).data('editorInstance');
// ensure the editor was initialized
if (isDefinedAndNotNull(editor)) {
editor.execCommand('selectAll');
}
});
},
/**
* Gets whether the value of the editor in the first matching selector has been modified.
*/
isModified: function () {
var modified;
this.each(function () {
modified = $(this).find('.CodeMirror').hasClass('modified');
return false;
});
return modified;
},
/**
* Destroys the editor.
*/
destroy: function () {
return this.removeData('editorInstance').find('.CodeMirror').removeClass('modified');
}
};
$.fn.nfeditor = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else {
return methods.init.apply(this, arguments);
}
};
}));

View File

@ -1,131 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
ul.CodeMirror-hints {
overflow-y: scroll;
}
div.el-section {
margin: 5px 0;
}
div.el-name {
font-weight: bold;
font-family: monospace;
font-size: 16px;
margin-bottom: 10px;
}
div.el-header {
float: left;
width: 75px;
font-weight: bold;
}
ul.el-arguments {
margin-top: 5px;
list-style-type: disc;
list-style-position: inside;
}
span.el-argument-name {
font-family: monospace;
}
div.nf-tooltip {
max-width: 350px;
}
div.mode-hint-tip {
z-index: 14000;
width: 455px;
padding: 10px;
position: absolute;
border: 1px solid #ddd;
border-radius: 2px;
background-color: #fff;
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.16);
font-size: 13px;
display: none;
}
div.mode-hint-tip > :first-child {
margin-bottom: 15px;
}
div.mode-hint-tip-title-container {
display: flex;
font-weight: bold;
margin-bottom: 5px;
}
div.mode-hint-tip-title-container > :first-child {
width: 10px;
margin-right: 10px;
color: #898989;
}
div.mode-hint-tip-title-container > .mode-supported {
color: #151515;
}
div.mode-hint-tip-title-container > .mode-unsupported {
color: #676767;
}
div.mode-hint-tip-description-container {
margin-left: 20px;
}
div.mode-hint-tip-description-container .hint-pattern {
padding: 0 2px;
letter-spacing: 1px;
font-weight: 400;
background-color: rgba(20, 145, 193, 0.12);
}
div.mode-hint-tip-description-container .hint-keystroke {
font-weight: 300;
font-style: italic;
}
div.mode-hint-container {
margin-top: 5px;
display: flex;
justify-content: flex-end;
height: 13px;
font-size: 11px;
color: #898989;
}
div.mode-hint-element {
cursor: default;
display: flex;
justify-content: space-between;
width: 96px;
}
div.mode-hint {
display: flex;
font-weight: bold;
font-style: italic;
}
div.mode-hint-value {
margin-left: 5px;
color: #898989;
}

View File

@ -1,49 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* global define, module, require, exports */
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery',
'nf.AuthorizationStorage'],
function ($, nfAuthorizationStorage) {
return (nf.AjaxSetup = factory($, nfAuthorizationStorage));
});
} else if (typeof exports === 'object' && typeof module === 'object') {
module.exports = (nf.AjaxSetup = factory(require('jquery'),
require('nf.AuthorizationStorage')));
} else {
nf.AjaxSetup = factory(root.$,
root.nf.AuthorizationStorage);
}
}(this, function ($, nfAuthorizationStorage) {
/**
* Performs ajax setup for use within NiFi.
*/
$(document).ready(function ($) {
$.ajaxSetup({
'beforeSend': function (xhr) {
// Get the Request Token for CSRF mitigation on and send on all requests
var requestToken = nfAuthorizationStorage.getRequestToken();
if (requestToken !== null) {
xhr.setRequestHeader('Request-Token', requestToken);
}
}
});
});
}));

View File

@ -1,86 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* global define, module, require, exports */
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define([], function () {
return (nf.AuthorizationStorage = factory());
});
} else if (typeof exports === 'object' && typeof module === 'object') {
module.exports = (nf.AuthorizationStorage = factory());
} else {
nf.AuthorizationStorage = factory();
}
}(this, function () {
var TOKEN_ITEM_KEY = 'Access-Token-Expiration';
var REQUEST_TOKEN_PATTERN = new RegExp('Request-Token=([^;]+)');
return {
/**
* Get Request Token from document cookies
*
* @return Request Token string or null when not found
*/
getRequestToken: function () {
var requestToken = null;
var requestTokenMatcher = REQUEST_TOKEN_PATTERN.exec(document.cookie);
if (requestTokenMatcher) {
requestToken = requestTokenMatcher[1];
}
return requestToken;
},
/**
* Get Token from Session Storage
*
* @return Bearer Token string
*/
getToken: function () {
return sessionStorage.getItem(TOKEN_ITEM_KEY);
},
/**
* Has Token returns the status of whether Session Storage contains the Token
*
* @return Boolean status of whether Session Storage contains the Token
*/
hasToken: function () {
var token = this.getToken();
return typeof token === 'string';
},
/**
* Remove Token from Session Storage
*
*/
removeToken: function () {
sessionStorage.removeItem(TOKEN_ITEM_KEY);
},
/**
* Set Token in Session Storage
*
* @param token Token String
*/
setToken: function (token) {
sessionStorage.setItem(TOKEN_ITEM_KEY, token);
}
};
}));

View File

@ -1,209 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* global define, module, require, exports */
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define([], function () {
return (nf.Storage = factory());
});
} else if (typeof exports === 'object' && typeof module === 'object') {
module.exports = (nf.Storage = factory());
} else {
nf.Storage = factory();
}
}(this, function () {
var disconnectionAcknowledged = false;
// Store items for two days before being eligible for removal.
var MILLIS_PER_DAY = 86400000;
var TWO_DAYS = MILLIS_PER_DAY * 2;
var isUndefined = function (obj) {
return typeof obj === 'undefined';
};
var isNull = function (obj) {
return obj === null;
};
var isDefinedAndNotNull = function (obj) {
return !isUndefined(obj) && !isNull(obj);
};
/**
* Checks the expiration for the specified entry.
*
* @param {object} entry
* @returns {boolean}
*/
var checkExpiration = function (entry) {
if (isDefinedAndNotNull(entry.expires)) {
// get the expiration
var expires = new Date(entry.expires);
var now = new Date();
// return whether the expiration date has passed
return expires.valueOf() < now.valueOf();
} else {
return false;
}
};
/**
* Gets an enty for the key. The entry expiration is not checked.
*
* @param {string} key
*/
var getEntry = function (key) {
try {
// parse the entry
var entry = JSON.parse(localStorage.getItem(key));
// ensure the entry and item are present
if (isDefinedAndNotNull(entry)) {
return entry;
} else {
return null;
}
} catch (e) {
return null;
}
};
return {
/**
* Initializes the storage. Items will be persisted for two days. Once the scripts runs
* thereafter, all eligible items will be removed. This strategy does not support persistence.
*/
init: function () {
for (var i = 0; i < localStorage.length; i++) {
try {
// get the next item
var key = localStorage.key(i);
// attempt to get the item which will expire if necessary
this.getItem(key);
} catch (e) {
}
}
},
acknowledgeDisconnection: function () {
disconnectionAcknowledged = true;
},
resetDisconnectionAcknowledgement: function () {
disconnectionAcknowledged = false;
},
isDisconnectionAcknowledged: function () {
return disconnectionAcknowledged;
},
/**
* Stores the specified item.
*
* @param {string} key
* @param {object} item
* @param {integer} expires
*/
setItem: function (key, item, expires) {
// calculate the expiration
expires = isDefinedAndNotNull(expires) ? expires : new Date().valueOf() + TWO_DAYS;
// create the entry
var entry = {
expires: expires,
item: item
};
// store the item
localStorage.setItem(key, JSON.stringify(entry));
},
/**
* Returns whether there is an entry for this key. This will not check the expiration. If
* the entry is expired, it will return null on a subsequent getItem invocation.
*
* @param {string} key
* @returns {boolean}
*/
hasItem: function (key) {
return getEntry(key) !== null;
},
/**
* Gets the item with the specified key. If an item with this key does
* not exist, null is returned. If an item exists but cannot be parsed
* or is malformed/unrecognized, null is returned.
*
* @param {type} key
*/
getItem: function (key) {
var entry = getEntry(key);
if (entry === null) {
return null;
}
// if the entry is expired, drop it and return null
if (checkExpiration(entry)) {
this.removeItem(key);
return null;
}
// if the entry has the specified field return its value
if (isDefinedAndNotNull(entry['item'])) {
return entry['item'];
} else {
return null;
}
},
/**
* Gets the expiration for the specified item. This will not check the expiration. If
* the entry is expired, it will return null on a subsequent getItem invocation.
*
* @param {string} key
* @returns {integer}
*/
getItemExpiration: function (key) {
var entry = getEntry(key);
if (entry === null) {
return null;
}
// if the entry has the specified field return its value
if (isDefinedAndNotNull(entry['expires'])) {
return entry['expires'];
} else {
return null;
}
},
/**
* Removes the item with the specified key.
*
* @param {type} key
*/
removeItem: function (key) {
localStorage.removeItem(key);
}
};
}));

View File

@ -1,146 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* global define, module, require, exports */
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], function ($) {
return (nf.UniversalCapture = factory($));
});
} else if (typeof exports === 'object' && typeof module === 'object') {
module.exports = (nf.UniversalCapture = factory(require('jquery')));
} else {
nf.UniversalCapture = factory(root.$);
}
}(this, function ($) {
'use strict';
/**
* Captures keydown on the window to ensure certain keystrokes are handled in a consistent manner, particularly those
* that can lead to browser navigation/reload.
*/
$(document).ready(function ($) {
// setup a listener to ensure keystrokes are being overridden in a consistent manner
$(window).on('keydown', function (evt) {
// consider escape, before checking dialogs
var isCtrl = evt.ctrlKey || evt.metaKey;
if (!isCtrl && evt.keyCode === 27) {
// esc
// prevent escape when editing a property with allowable values - that component does not handle key
// events so it can bubble up to here. once here we are unable to cancel the current edit so we simply
// return. this is not an issue for viewing in read only mode as the table is not in an edit mode. this
// is not an issue for other fields as they can handle key events locally and cancel the edit appropriately
var visibleCombo = $('div.value-combo');
if (visibleCombo.is(':visible') && visibleCombo.parent().hasClass('combo-editor')) {
return;
}
// consider property detail dialogs
if ($('div.property-detail').is(':visible')) {
nfUniversalDialog.removeAllPropertyDetailDialogs();
// prevent further bubbling as we're already handled it
evt.stopImmediatePropagation();
evt.preventDefault();
} else {
var target = $(evt.target);
if (target.length) {
// special handling for body as the target
var cancellables = $('.cancellable');
if (cancellables.length) {
var zIndexMax = null;
var dialogMax = null;
// identify the top most cancellable
$.each(cancellables, function (_, cancellable) {
var dialog = $(cancellable);
var zIndex = dialog.css('zIndex');
// if the dialog has a zIndex consider it
if (dialog.is(':visible') && (zIndex !== null && typeof zIndex !== 'undefined')) {
zIndex = parseInt(zIndex, 10);
if (zIndexMax === null || zIndex > zIndexMax) {
zIndexMax = zIndex;
dialogMax = dialog;
}
}
});
// if we've identified a dialog to close do so and stop propagation
if (dialogMax !== null) {
// hide the cancellable
if (dialogMax.hasClass('modal')) {
dialogMax.modal('hide');
} else {
dialogMax.hide();
}
// prevent further bubbling as we're already handled it
evt.stopImmediatePropagation();
evt.preventDefault();
return;
}
}
// now see if we're in a frame
if (top !== window) {
// and our parent has shell defined
if (typeof parent.nf !== 'undefined' && typeof parent.nf.Shell !== 'undefined') {
parent.$('#shell-close-button').click();
// prevent further bubbling as we're already handled it
evt.stopImmediatePropagation();
evt.preventDefault();
return;
}
}
}
}
} else {
if (isCtrl) {
if (evt.keyCode === 82) {
// ctrl-r
evt.preventDefault();
}
} else {
if (!$('input, textarea').is(':focus') && (evt.keyCode == 8 || evt.keyCode === 46)) {
// backspace or delete
evt.preventDefault();
}
}
}
});
});
var nfUniversalDialog = {
/**
* Removes all read only property detail dialogs.
*/
removeAllPropertyDetailDialogs: function () {
var propertyDetails = $('body').find('div.property-detail');
propertyDetails.find('div.nf-editor').nfeditor('destroy'); // look for any nfel editors
propertyDetails.find('div.value-combo').combo('destroy'); // look for any combos
propertyDetails.hide().remove();
}
};
return nfUniversalDialog;
}));

View File

@ -26,6 +26,7 @@ import java.util.Map;
public class ComponentDetails { public class ComponentDetails {
private final String id; private final String id;
private final Revision revision;
private final String name; private final String name;
private final String type; private final String type;
private final String state; private final String state;
@ -37,6 +38,7 @@ public class ComponentDetails {
private ComponentDetails(final Builder builder) { private ComponentDetails(final Builder builder) {
this.id = builder.id; this.id = builder.id;
this.revision = builder.revision;
this.name = builder.name; this.name = builder.name;
this.type = builder.type; this.type = builder.type;
this.state = builder.state; this.state = builder.state;
@ -44,7 +46,6 @@ public class ComponentDetails {
this.properties = builder.properties; this.properties = builder.properties;
this.descriptors = builder.descriptors; this.descriptors = builder.descriptors;
this.validationErrors = builder.validationErrors; this.validationErrors = builder.validationErrors;
} }
/** /**
@ -54,6 +55,13 @@ public class ComponentDetails {
return id; return id;
} }
/**
* @return component revision
*/
public Revision getRevision() {
return revision;
}
/** /**
* @return component name * @return component name
*/ */
@ -107,6 +115,7 @@ public class ComponentDetails {
public static final class Builder { public static final class Builder {
private String id; private String id;
private Revision revision;
private String name; private String name;
private String type; private String type;
private String state; private String state;
@ -121,6 +130,11 @@ public class ComponentDetails {
return this; return this;
} }
public Builder revision(final Revision revision) {
this.revision = revision;
return this;
}
public Builder name(final String name) { public Builder name(final String name) {
this.name = name; this.name = name;
return this; return this;

View File

@ -62,6 +62,26 @@ public class AuthorizeParameterReference {
} }
} }
public static void authorizeParameterReferences(final String annotationData, final Authorizer authorizer, final Authorizable parameterContextAuthorizable, final NiFiUser user) {
if (annotationData == null || parameterContextAuthorizable == null) {
return;
}
final ParameterParser parameterParser = new ExpressionLanguageAgnosticParameterParser();
boolean referencesParameter = false;
// Check if any Parameter is referenced. If so, user must have READ policy on the Parameter Context
ParameterTokenList tokenList = parameterParser.parseTokens(annotationData);
if (!tokenList.toReferenceList().isEmpty()) {
referencesParameter = true;
}
if (referencesParameter) {
parameterContextAuthorizable.authorize(authorizer, RequestAction.READ, user);
}
}
public static void authorizeParameterReferences(final ComponentAuthorizable authorizable, final Authorizer authorizer, final Authorizable parameterContextAuthorizable, final NiFiUser user) { public static void authorizeParameterReferences(final ComponentAuthorizable authorizable, final Authorizer authorizer, final Authorizable parameterContextAuthorizable, final NiFiUser user) {
if (parameterContextAuthorizable == null) { if (parameterContextAuthorizable == null) {
return; return;

View File

@ -25,6 +25,7 @@ import org.apache.nifi.action.component.details.FlowChangeExtensionDetails;
import org.apache.nifi.action.details.FlowChangeConfigureDetails; import org.apache.nifi.action.details.FlowChangeConfigureDetails;
import org.apache.nifi.admin.service.AuditService; import org.apache.nifi.admin.service.AuditService;
import org.apache.nifi.authorization.AuthorizeControllerServiceReference; import org.apache.nifi.authorization.AuthorizeControllerServiceReference;
import org.apache.nifi.authorization.AuthorizeParameterReference;
import org.apache.nifi.authorization.Authorizer; import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.ComponentAuthorizable; import org.apache.nifi.authorization.ComponentAuthorizable;
import org.apache.nifi.authorization.RequestAction; import org.apache.nifi.authorization.RequestAction;
@ -102,6 +103,10 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
}); });
} }
private Revision getRevision(final RevisionDTO revision, final String id) {
return new Revision(revision.getVersion(), revision.getClientId(), id);
}
@Override @Override
public ControllerService getControllerService(final String serviceIdentifier, final String componentId) { public ControllerService getControllerService(final String serviceIdentifier, final String componentId) {
final NiFiUser user = NiFiUserUtils.getNiFiUser(); final NiFiUser user = NiFiUserUtils.getNiFiUser();
@ -354,7 +359,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser()); authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser());
}); });
final ProcessorDTO processor; ProcessorEntity entity;
if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -380,17 +385,16 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return processor // return processor
ProcessorEntity entity = (ProcessorEntity) nodeResponse.getUpdatedEntity(); entity = (ProcessorEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ProcessorEntity.class); entity = nodeResponse.getClientResponse().readEntity(ProcessorEntity.class);
} }
processor = entity.getComponent();
} else { } else {
processor = serviceFacade.getProcessor(id).getComponent(); entity = serviceFacade.getProcessor(id);
} }
// return the processor info // return the processor info
return getComponentConfiguration(processor); return getComponentConfiguration(entity);
} }
@Override @Override
@ -407,9 +411,13 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
// authorize any referenced service // authorize any referenced service
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup); AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup);
// authorize any parameter references
AuthorizeParameterReference.authorizeParameterReferences(properties, authorizer, authorizable.getParameterContext(), user);
AuthorizeParameterReference.authorizeParameterReferences(annotationData, authorizer, authorizable.getParameterContext(), user);
}); });
final ProcessorDTO processor; ProcessorEntity entity;
if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -449,20 +457,18 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return processor // return processor
ProcessorEntity entity = (ProcessorEntity) nodeResponse.getUpdatedEntity(); entity = (ProcessorEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ProcessorEntity.class); entity = nodeResponse.getClientResponse().readEntity(ProcessorEntity.class);
} }
processor = entity.getComponent();
} else { } else {
// update processor within write lock // update processor within write lock
ProcessorDTO processorDTO = buildProcessorDto(id, annotationData, properties); ProcessorDTO processorDTO = buildProcessorDto(id, annotationData, properties);
final ProcessorEntity entity = serviceFacade.updateProcessor(revision, processorDTO); entity = serviceFacade.updateProcessor(revision, processorDTO);
processor = entity.getComponent();
} }
// return the processor info // return the processor info
return getComponentConfiguration(processor); return getComponentConfiguration(entity);
} }
private ProcessorDTO buildProcessorDto(String id, final String annotationData, Map<String, String> properties) { private ProcessorDTO buildProcessorDto(String id, final String annotationData, Map<String, String> properties) {
@ -473,13 +479,14 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
configDto.setAnnotationData(annotationData); configDto.setAnnotationData(annotationData);
configDto.setProperties(properties); configDto.setProperties(properties);
return processorDto; return processorDto;
} }
private ComponentDetails getComponentConfiguration(final ProcessorDTO processor) { private ComponentDetails getComponentConfiguration(final ProcessorEntity entity) {
final ProcessorDTO processor = entity.getComponent();
final ProcessorConfigDTO processorConfig = processor.getConfig(); final ProcessorConfigDTO processorConfig = processor.getConfig();
return new ComponentDetails.Builder() return new ComponentDetails.Builder()
.id(processor.getId()) .id(processor.getId())
.revision(getRevision(entity.getRevision(), entity.getId()))
.name(processor.getName()) .name(processor.getName())
.type(processor.getType()) .type(processor.getType())
.state(processor.getState()) .state(processor.getState())
@ -530,7 +537,6 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
@Override @Override
public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) { public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) {
final String id = requestContext.getId(); final String id = requestContext.getId();
final ControllerServiceDTO controllerService;
// authorize access // authorize access
serviceFacade.authorizeAccess(lookup -> { serviceFacade.authorizeAccess(lookup -> {
@ -538,6 +544,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser()); authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser());
}); });
ControllerServiceEntity entity;
if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -563,17 +570,16 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return controller service // return controller service
ControllerServiceEntity entity = (ControllerServiceEntity) nodeResponse.getUpdatedEntity(); entity = (ControllerServiceEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ControllerServiceEntity.class); entity = nodeResponse.getClientResponse().readEntity(ControllerServiceEntity.class);
} }
controllerService = entity.getComponent();
} else { } else {
controllerService = serviceFacade.getControllerService(id, true).getComponent(); entity = serviceFacade.getControllerService(id, true);
} }
// return the controller service info // return the controller service info
return getComponentConfiguration(controllerService); return getComponentConfiguration(entity);
} }
@Override @Override
@ -590,9 +596,13 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
// authorize any referenced service // authorize any referenced service
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup); AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup);
// authorize any parameter references
AuthorizeParameterReference.authorizeParameterReferences(properties, authorizer, authorizable.getParameterContext(), user);
AuthorizeParameterReference.authorizeParameterReferences(annotationData, authorizer, authorizable.getParameterContext(), user);
}); });
final ControllerServiceDTO controllerService; ControllerServiceEntity entity;
if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -635,11 +645,10 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return controller service // return controller service
ControllerServiceEntity entity = (ControllerServiceEntity) nodeResponse.getUpdatedEntity(); entity = (ControllerServiceEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ControllerServiceEntity.class); entity = nodeResponse.getClientResponse().readEntity(ControllerServiceEntity.class);
} }
controllerService = entity.getComponent();
} else { } else {
final ControllerServiceDTO controllerServiceDto = new ControllerServiceDTO(); final ControllerServiceDTO controllerServiceDto = new ControllerServiceDTO();
controllerServiceDto.setId(id); controllerServiceDto.setId(id);
@ -647,17 +656,18 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
controllerServiceDto.setProperties(properties); controllerServiceDto.setProperties(properties);
// update controller service // update controller service
final ControllerServiceEntity entity = serviceFacade.updateControllerService(revision, controllerServiceDto); entity = serviceFacade.updateControllerService(revision, controllerServiceDto);
controllerService = entity.getComponent();
} }
// return the controller service info // return the controller service info
return getComponentConfiguration(controllerService); return getComponentConfiguration(entity);
} }
private ComponentDetails getComponentConfiguration(final ControllerServiceDTO controllerService) { private ComponentDetails getComponentConfiguration(final ControllerServiceEntity entity) {
final ControllerServiceDTO controllerService = entity.getComponent();
return new ComponentDetails.Builder() return new ComponentDetails.Builder()
.id(controllerService.getId()) .id(controllerService.getId())
.revision(getRevision(entity.getRevision(), entity.getId()))
.name(controllerService.getName()) .name(controllerService.getName())
.type(controllerService.getType()) .type(controllerService.getType())
.state(controllerService.getState()) .state(controllerService.getState())
@ -675,7 +685,6 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
@Override @Override
public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) { public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) {
final String id = requestContext.getId(); final String id = requestContext.getId();
final ReportingTaskDTO reportingTask;
// authorize access // authorize access
serviceFacade.authorizeAccess(lookup -> { serviceFacade.authorizeAccess(lookup -> {
@ -683,6 +692,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser()); authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser());
}); });
ReportingTaskEntity entity;
if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -708,17 +718,16 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return reporting task // return reporting task
ReportingTaskEntity entity = (ReportingTaskEntity) nodeResponse.getUpdatedEntity(); entity = (ReportingTaskEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ReportingTaskEntity.class); entity = nodeResponse.getClientResponse().readEntity(ReportingTaskEntity.class);
} }
reportingTask = entity.getComponent();
} else { } else {
reportingTask = serviceFacade.getReportingTask(id).getComponent(); entity = serviceFacade.getReportingTask(id);
} }
// return the reporting task info // return the reporting task info
return getComponentConfiguration(reportingTask); return getComponentConfiguration(entity);
} }
@Override @Override
@ -737,7 +746,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup); AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup);
}); });
final ReportingTaskDTO reportingTask; ReportingTaskEntity entity;
if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -780,11 +789,10 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return reporting task // return reporting task
ReportingTaskEntity entity = (ReportingTaskEntity) nodeResponse.getUpdatedEntity(); entity = (ReportingTaskEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ReportingTaskEntity.class); entity = nodeResponse.getClientResponse().readEntity(ReportingTaskEntity.class);
} }
reportingTask = entity.getComponent();
} else { } else {
final ReportingTaskDTO reportingTaskDto = new ReportingTaskDTO(); final ReportingTaskDTO reportingTaskDto = new ReportingTaskDTO();
reportingTaskDto.setId(id); reportingTaskDto.setId(id);
@ -793,17 +801,18 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
// obtain write lock // obtain write lock
serviceFacade.verifyRevision(revision, user); serviceFacade.verifyRevision(revision, user);
final ReportingTaskEntity entity = serviceFacade.updateReportingTask(revision, reportingTaskDto); entity = serviceFacade.updateReportingTask(revision, reportingTaskDto);
reportingTask = entity.getComponent();
} }
// return the processor info // return the processor info
return getComponentConfiguration(reportingTask); return getComponentConfiguration(entity);
} }
private ComponentDetails getComponentConfiguration(final ReportingTaskDTO reportingTask) { private ComponentDetails getComponentConfiguration(final ReportingTaskEntity entity) {
final ReportingTaskDTO reportingTask = entity.getComponent();
return new ComponentDetails.Builder() return new ComponentDetails.Builder()
.id(reportingTask.getId()) .id(reportingTask.getId())
.revision(getRevision(entity.getRevision(), entity.getId()))
.name(reportingTask.getName()) .name(reportingTask.getName())
.type(reportingTask.getType()) .type(reportingTask.getType())
.state(reportingTask.getState()) .state(reportingTask.getState())
@ -821,7 +830,6 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
@Override @Override
public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) { public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) {
final String id = requestContext.getId(); final String id = requestContext.getId();
final ParameterProviderDTO parameterProvider;
// authorize access // authorize access
serviceFacade.authorizeAccess(lookup -> { serviceFacade.authorizeAccess(lookup -> {
@ -829,6 +837,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser()); authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser());
}); });
ParameterProviderEntity entity;
if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -854,17 +863,16 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return parameter provider // return parameter provider
ParameterProviderEntity entity = (ParameterProviderEntity) nodeResponse.getUpdatedEntity(); entity = (ParameterProviderEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ParameterProviderEntity.class); entity = nodeResponse.getClientResponse().readEntity(ParameterProviderEntity.class);
} }
parameterProvider = entity.getComponent();
} else { } else {
parameterProvider = serviceFacade.getParameterProvider(id).getComponent(); entity = serviceFacade.getParameterProvider(id);
} }
// return the parameter provider info // return the parameter provider info
return getComponentConfiguration(parameterProvider); return getComponentConfiguration(entity);
} }
@Override @Override
@ -883,7 +891,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup); AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup);
}); });
final ParameterProviderDTO parameterProvider; ParameterProviderEntity entity;
if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -926,11 +934,10 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return parameter provider // return parameter provider
ParameterProviderEntity entity = (ParameterProviderEntity) nodeResponse.getUpdatedEntity(); entity = (ParameterProviderEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(ParameterProviderEntity.class); entity = nodeResponse.getClientResponse().readEntity(ParameterProviderEntity.class);
} }
parameterProvider = entity.getComponent();
} else { } else {
final ParameterProviderDTO parameterProviderDto = new ParameterProviderDTO(); final ParameterProviderDTO parameterProviderDto = new ParameterProviderDTO();
parameterProviderDto.setId(id); parameterProviderDto.setId(id);
@ -939,17 +946,18 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
// obtain write lock // obtain write lock
serviceFacade.verifyRevision(revision, user); serviceFacade.verifyRevision(revision, user);
final ParameterProviderEntity entity = serviceFacade.updateParameterProvider(revision, parameterProviderDto); entity = serviceFacade.updateParameterProvider(revision, parameterProviderDto);
parameterProvider = entity.getComponent();
} }
// return the processor info // return the processor info
return getComponentConfiguration(parameterProvider); return getComponentConfiguration(entity);
} }
private ComponentDetails getComponentConfiguration(final ParameterProviderDTO parameterProvider) { private ComponentDetails getComponentConfiguration(final ParameterProviderEntity entity) {
final ParameterProviderDTO parameterProvider = entity.getComponent();
return new ComponentDetails.Builder() return new ComponentDetails.Builder()
.id(parameterProvider.getId()) .id(parameterProvider.getId())
.revision(getRevision(entity.getRevision(), entity.getId()))
.name(parameterProvider.getName()) .name(parameterProvider.getName())
.type(parameterProvider.getType()) .type(parameterProvider.getType())
.annotationData(parameterProvider.getAnnotationData()) .annotationData(parameterProvider.getAnnotationData())
@ -966,7 +974,6 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
@Override @Override
public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) { public ComponentDetails getComponentDetails(final NiFiWebRequestContext requestContext) {
final String id = requestContext.getId(); final String id = requestContext.getId();
final FlowRegistryClientDTO flowRegistryClient;
// authorize access // authorize access
serviceFacade.authorizeAccess(lookup -> { serviceFacade.authorizeAccess(lookup -> {
@ -974,6 +981,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser()); authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser());
}); });
FlowRegistryClientEntity entity;
if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -999,17 +1007,16 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return flow registry client // return flow registry client
FlowRegistryClientEntity entity = (FlowRegistryClientEntity) nodeResponse.getUpdatedEntity(); entity = (FlowRegistryClientEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(FlowRegistryClientEntity.class); entity = nodeResponse.getClientResponse().readEntity(FlowRegistryClientEntity.class);
} }
flowRegistryClient = entity.getComponent();
} else { } else {
flowRegistryClient = serviceFacade.getRegistryClient(id).getComponent(); entity = serviceFacade.getRegistryClient(id);
} }
// return the flow registry client info // return the flow registry client info
return getComponentConfiguration(flowRegistryClient); return getComponentConfiguration(entity);
} }
@Override @Override
@ -1028,7 +1035,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup); AuthorizeControllerServiceReference.authorizeControllerServiceReferences(properties, authorizable, authorizer, lookup);
}); });
final FlowRegistryClientDTO flowRegistryClient; FlowRegistryClientEntity entity;
if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) {
// create the request URL // create the request URL
URI requestUrl; URI requestUrl;
@ -1071,11 +1078,10 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
checkResponse(nodeResponse, id); checkResponse(nodeResponse, id);
// return flow registry client // return flow registry client
FlowRegistryClientEntity entity = (FlowRegistryClientEntity) nodeResponse.getUpdatedEntity(); entity = (FlowRegistryClientEntity) nodeResponse.getUpdatedEntity();
if (entity == null) { if (entity == null) {
entity = nodeResponse.getClientResponse().readEntity(FlowRegistryClientEntity.class); entity = nodeResponse.getClientResponse().readEntity(FlowRegistryClientEntity.class);
} }
flowRegistryClient = entity.getComponent();
} else { } else {
final FlowRegistryClientDTO flowRegistryClientDTO = new FlowRegistryClientDTO(); final FlowRegistryClientDTO flowRegistryClientDTO = new FlowRegistryClientDTO();
flowRegistryClientDTO.setId(id); flowRegistryClientDTO.setId(id);
@ -1084,17 +1090,18 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration
// obtain write lock // obtain write lock
serviceFacade.verifyRevision(revision, user); serviceFacade.verifyRevision(revision, user);
final FlowRegistryClientEntity entity = serviceFacade.updateRegistryClient(revision, flowRegistryClientDTO); entity = serviceFacade.updateRegistryClient(revision, flowRegistryClientDTO);
flowRegistryClient = entity.getComponent();
} }
// return the processor info // return the processor info
return getComponentConfiguration(flowRegistryClient); return getComponentConfiguration(entity);
} }
private ComponentDetails getComponentConfiguration(final FlowRegistryClientDTO parameterProvider) { private ComponentDetails getComponentConfiguration(final FlowRegistryClientEntity entity) {
final FlowRegistryClientDTO parameterProvider = entity.getComponent();
return new ComponentDetails.Builder() return new ComponentDetails.Builder()
.id(parameterProvider.getId()) .id(parameterProvider.getId())
.revision(getRevision(entity.getRevision(), entity.getId()))
.name(parameterProvider.getName()) .name(parameterProvider.getName())
.type(parameterProvider.getType()) .type(parameterProvider.getType())
.annotationData(parameterProvider.getAnnotationData()) .annotationData(parameterProvider.getAnnotationData())

View File

@ -156,6 +156,32 @@
</resources> </resources>
</configuration> </configuration>
</execution> </execution>
<execution>
<id>copy-built-update-attribute-app</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.finalName}/update-attribute</outputDirectory>
<resources>
<resource>
<directory>${frontend.working.dir}/dist/update-attribute/browser</directory>
<filtering>false</filtering>
<includes>
<include>**/*</include>
</includes>
</resource>
<resource>
<directory>${frontend.working.dir}/dist/update-attribute</directory>
<filtering>false</filtering>
<includes>
<include>3rdpartylicenses.txt</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
<!-- <!--
Copy the staged applications into the bundle. Each application requires its own configuration. Copy the staged applications into the bundle. Each application requires its own configuration.
--> -->
@ -216,6 +242,25 @@
</resources> </resources>
</configuration> </configuration>
</execution> </execution>
<execution>
<id>bundle-built-update-attribute-app</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.outputDirectory}/update-attribute</outputDirectory>
<resources>
<resource>
<directory>${project.build.directory}/${project.build.finalName}/update-attribute</directory>
<filtering>false</filtering>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions> </executions>
</plugin> </plugin>
<plugin> <plugin>

View File

@ -89,7 +89,7 @@
}, },
"development": { "development": {
"buildTarget": "nifi-jolt-transform-ui:build:development", "buildTarget": "nifi-jolt-transform-ui:build:development",
"servePath": "/nifi-jolt-transform-json-ui-2.0.0-SNAPSHOT/" "servePath": "/nifi-jolt-transform-json-ui-2.1.0-SNAPSHOT/"
} }
}, },
"defaultConfiguration": "development" "defaultConfiguration": "development"

View File

@ -19,7 +19,7 @@ import { JoltTransformJsonUi } from './jolt-transform-json-ui.component';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { provideMockStore } from '@ngrx/store/testing'; import { provideMockStore } from '@ngrx/store/testing';
import { initialState } from '../state/jolt-transform-json-processor-details/jolt-transform-json-processor-details.reducer'; import { initialState } from '../state/jolt-transform-json-processor-details/jolt-transform-json-processor-details.reducer';
import { joltTransformJsonUiFeatureKey } from '../state'; import { joltTransformJsonProcessorDetailsFeatureKey, joltTransformJsonUiFeatureKey } from '../state';
describe('jolt-transform-json-ui', () => { describe('jolt-transform-json-ui', () => {
let component: JoltTransformJsonUi; let component: JoltTransformJsonUi;
@ -32,7 +32,7 @@ describe('jolt-transform-json-ui', () => {
provideMockStore({ provideMockStore({
initialState: { initialState: {
[joltTransformJsonUiFeatureKey]: { [joltTransformJsonUiFeatureKey]: {
[joltTransformJsonUiFeatureKey]: initialState [joltTransformJsonProcessorDetailsFeatureKey]: initialState
} }
} }
}) })

View File

@ -28,8 +28,7 @@ import { MatDialog } from '@angular/material/dialog';
import { AccessPolicyService } from '../../service/access-policy.service'; import { AccessPolicyService } from '../../service/access-policy.service';
import { AccessPolicyEntity, ComponentResourceAction, PolicyStatus, ResourceAction } from '../shared'; import { AccessPolicyEntity, ComponentResourceAction, PolicyStatus, ResourceAction } from '../shared';
import { selectAccessPolicy, selectResourceAction, selectSaving } from './access-policy.selectors'; import { selectAccessPolicy, selectResourceAction, selectSaving } from './access-policy.selectors';
import { YesNoDialog } from '../../../../ui/common/yes-no-dialog/yes-no-dialog.component'; import { isDefinedAndNotNull, MEDIUM_DIALOG, SMALL_DIALOG, YesNoDialog } from '@nifi/shared';
import { isDefinedAndNotNull, MEDIUM_DIALOG, SMALL_DIALOG } from 'libs/shared/src';
import { TenantEntity } from '../../../../state/shared'; import { TenantEntity } from '../../../../state/shared';
import { AddTenantToPolicyDialog } from '../../ui/common/add-tenant-to-policy-dialog/add-tenant-to-policy-dialog.component'; import { AddTenantToPolicyDialog } from '../../ui/common/add-tenant-to-policy-dialog/add-tenant-to-policy-dialog.component';
import { AddTenantsToPolicyRequest } from './index'; import { AddTenantsToPolicyRequest } from './index';

View File

@ -15,7 +15,8 @@
* limitations under the License. * limitations under the License.
*/ */
import { AccessPolicySummary, Permissions, Revision, TenantEntity } from '../../../../state/shared'; import { AccessPolicySummary, TenantEntity } from '../../../../state/shared';
import { Revision, Permissions } from '@nifi/shared';
export enum PolicyStatus { export enum PolicyStatus {
Found = 'Found', Found = 'Found',

View File

@ -39,8 +39,7 @@ import {
import { distinctUntilChanged } from 'rxjs'; import { distinctUntilChanged } from 'rxjs';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { NiFiCommon, TextTip } from '@nifi/shared'; import { ComponentType, isDefinedAndNotNull, NiFiCommon, SelectOption, TextTip } from '@nifi/shared';
import { ComponentType, isDefinedAndNotNull, SelectOption } from 'libs/shared/src';
import { AccessPolicyEntity, Action, PolicyStatus, ResourceAction } from '../../state/shared'; import { AccessPolicyEntity, Action, PolicyStatus, ResourceAction } from '../../state/shared';
import { selectFlowConfiguration } from '../../../../state/flow-configuration/flow-configuration.selectors'; import { selectFlowConfiguration } from '../../../../state/flow-configuration/flow-configuration.selectors';
import { loadTenants, resetTenantsState } from '../../state/tenants/tenants.actions'; import { loadTenants, resetTenantsState } from '../../state/tenants/tenants.actions';

View File

@ -38,8 +38,7 @@ import {
import { distinctUntilChanged } from 'rxjs'; import { distinctUntilChanged } from 'rxjs';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { NiFiCommon, TextTip } from '@nifi/shared'; import { ComponentType, isDefinedAndNotNull, NiFiCommon, SelectOption, TextTip } from '@nifi/shared';
import { ComponentType, isDefinedAndNotNull, SelectOption } from 'libs/shared/src';
import { RequiredPermission } from '../../../../state/shared'; import { RequiredPermission } from '../../../../state/shared';
import { AccessPolicyEntity, Action, PolicyStatus } from '../../state/shared'; import { AccessPolicyEntity, Action, PolicyStatus } from '../../state/shared';
import { loadExtensionTypesForPolicies } from '../../../../state/extension-types/extension-types.actions'; import { loadExtensionTypesForPolicies } from '../../../../state/extension-types/extension-types.actions';

View File

@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { BulletinEntity } from '../../../../state/shared'; import { BulletinEntity } from '@nifi/shared';
export const bulletinBoardFeatureKey = 'bulletin-board'; export const bulletinBoardFeatureKey = 'bulletin-board';

View File

@ -27,16 +27,13 @@ import {
Output, Output,
ViewChild ViewChild
} from '@angular/core'; } from '@angular/core';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatOptionModule } from '@angular/material/core'; import { MatOptionModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { NiFiCommon } from '@nifi/shared'; import { BulletinEntity, ComponentType, NiFiCommon } from '@nifi/shared';
import { BulletinBoardEvent, BulletinBoardFilterArgs, BulletinBoardItem } from '../../../state/bulletin-board'; import { BulletinBoardEvent, BulletinBoardFilterArgs, BulletinBoardItem } from '../../../state/bulletin-board';
import { ComponentType } from 'libs/shared/src';
import { BulletinEntity } from '../../../../../state/shared';
import { debounceTime, delay, Subject } from 'rxjs'; import { debounceTime, delay, Subject } from 'rxjs';
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';

View File

@ -28,8 +28,7 @@ import { selectClusterListingStatus } from './cluster-listing.selectors';
import { reloadSystemDiagnostics } from '../../../../state/system-diagnostics/system-diagnostics.actions'; import { reloadSystemDiagnostics } from '../../../../state/system-diagnostics/system-diagnostics.actions';
import { ClusterService } from '../../service/cluster.service'; import { ClusterService } from '../../service/cluster.service';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { YesNoDialog } from '../../../../ui/common/yes-no-dialog/yes-no-dialog.component'; import { LARGE_DIALOG, MEDIUM_DIALOG, SMALL_DIALOG, YesNoDialog } from '@nifi/shared';
import { LARGE_DIALOG, MEDIUM_DIALOG, SMALL_DIALOG } from 'libs/shared/src';
import { ClusterNodeDetailDialog } from '../../ui/cluster-node-listing/cluster-node-detail-dialog/cluster-node-detail-dialog.component'; import { ClusterNodeDetailDialog } from '../../ui/cluster-node-listing/cluster-node-detail-dialog/cluster-node-detail-dialog.component';
import * as ErrorActions from '../../../../state/error/error.actions'; import * as ErrorActions from '../../../../state/error/error.actions';
import { SelectClusterNodeRequest } from './index'; import { SelectClusterNodeRequest } from './index';

View File

@ -26,7 +26,7 @@ import {
selectClusterStorageRepositoryIdFromRoute selectClusterStorageRepositoryIdFromRoute
} from '../../state/cluster-listing/cluster-listing.selectors'; } from '../../state/cluster-listing/cluster-listing.selectors';
import { selectSystemNodeSnapshots } from '../../../../state/system-diagnostics/system-diagnostics.selectors'; import { selectSystemNodeSnapshots } from '../../../../state/system-diagnostics/system-diagnostics.selectors';
import { isDefinedAndNotNull } from 'libs/shared/src'; import { isDefinedAndNotNull } from '@nifi/shared';
import { map } from 'rxjs'; import { map } from 'rxjs';
import { ClusterNodeRepositoryStorageUsage } from '../../../../state/system-diagnostics'; import { ClusterNodeRepositoryStorageUsage } from '../../../../state/system-diagnostics';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';

View File

@ -29,7 +29,7 @@ import { NiFiState } from '../../../../state';
import { initialClusterState } from '../../state/cluster-listing/cluster-listing.reducer'; import { initialClusterState } from '../../state/cluster-listing/cluster-listing.reducer';
import { ClusterNodeRepositoryStorageUsage } from '../../../../state/system-diagnostics'; import { ClusterNodeRepositoryStorageUsage } from '../../../../state/system-diagnostics';
import { map } from 'rxjs'; import { map } from 'rxjs';
import { isDefinedAndNotNull } from 'libs/shared/src'; import { isDefinedAndNotNull } from '@nifi/shared';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { import {
clearFlowFileStorageNodeSelection, clearFlowFileStorageNodeSelection,

View File

@ -23,7 +23,7 @@ import {
selectClusterStorageRepositoryIdFromRoute selectClusterStorageRepositoryIdFromRoute
} from '../../state/cluster-listing/cluster-listing.selectors'; } from '../../state/cluster-listing/cluster-listing.selectors';
import { selectSystemNodeSnapshots } from '../../../../state/system-diagnostics/system-diagnostics.selectors'; import { selectSystemNodeSnapshots } from '../../../../state/system-diagnostics/system-diagnostics.selectors';
import { isDefinedAndNotNull } from 'libs/shared/src'; import { isDefinedAndNotNull } from '@nifi/shared';
import { map } from 'rxjs'; import { map } from 'rxjs';
import { ClusterNodeRepositoryStorageUsage } from '../../../../state/system-diagnostics'; import { ClusterNodeRepositoryStorageUsage } from '../../../../state/system-diagnostics';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';

View File

@ -24,12 +24,11 @@ import * as CounterListingActions from './counter-listing.actions';
import { catchError, from, map, of, switchMap, take, tap } from 'rxjs'; import { catchError, from, map, of, switchMap, take, tap } from 'rxjs';
import { CountersService } from '../../service/counters.service'; import { CountersService } from '../../service/counters.service';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { YesNoDialog } from '../../../../ui/common/yes-no-dialog/yes-no-dialog.component'; import { SMALL_DIALOG, YesNoDialog } from '@nifi/shared';
import * as ErrorActions from '../../../../state/error/error.actions'; import * as ErrorActions from '../../../../state/error/error.actions';
import { ErrorHelper } from '../../../../service/error-helper.service'; import { ErrorHelper } from '../../../../service/error-helper.service';
import { HttpErrorResponse } from '@angular/common/http'; import { HttpErrorResponse } from '@angular/common/http';
import { selectStatus } from './counter-listing.selectors'; import { selectStatus } from './counter-listing.selectors';
import { SMALL_DIALOG } from 'libs/shared/src';
@Injectable() @Injectable()
export class CounterListingEffects { export class CounterListingEffects {

View File

@ -31,11 +31,9 @@ import { HttpErrorResponse } from '@angular/common/http';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { ActionDetails } from '../../ui/flow-configuration-history-listing/action-details/action-details.component'; import { ActionDetails } from '../../ui/flow-configuration-history-listing/action-details/action-details.component';
import { PurgeHistory } from '../../ui/flow-configuration-history-listing/purge-history/purge-history.component'; import { PurgeHistory } from '../../ui/flow-configuration-history-listing/purge-history/purge-history.component';
import { YesNoDialog } from '../../../../ui/common/yes-no-dialog/yes-no-dialog.component'; import { isDefinedAndNotNull, MEDIUM_DIALOG, SMALL_DIALOG, YesNoDialog } from '@nifi/shared';
import { isDefinedAndNotNull } from 'libs/shared/src';
import * as ErrorActions from '../../../../state/error/error.actions'; import * as ErrorActions from '../../../../state/error/error.actions';
import { selectAbout } from '../../../../state/about/about.selectors'; import { selectAbout } from '../../../../state/about/about.selectors';
import { MEDIUM_DIALOG, SMALL_DIALOG } from 'libs/shared/src';
@Injectable() @Injectable()
export class FlowConfigurationHistoryListingEffects { export class FlowConfigurationHistoryListingEffects {

View File

@ -36,7 +36,6 @@ import { MatPaginatorModule, PageEvent } from '@angular/material/paginator';
import { FlowConfigurationHistoryTable } from './flow-configuration-history-table/flow-configuration-history-table.component'; import { FlowConfigurationHistoryTable } from './flow-configuration-history-table/flow-configuration-history-table.component';
import { Sort } from '@angular/material/sort'; import { Sort } from '@angular/material/sort';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { isDefinedAndNotNull } from 'libs/shared/src';
import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
@ -45,7 +44,7 @@ import { MatSelectModule } from '@angular/material/select';
import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDatepickerModule } from '@angular/material/datepicker';
import { selectAbout } from '../../../../state/about/about.selectors'; import { selectAbout } from '../../../../state/about/about.selectors';
import { debounceTime } from 'rxjs'; import { debounceTime } from 'rxjs';
import { NiFiCommon } from '@nifi/shared'; import { isDefinedAndNotNull, NiFiCommon } from '@nifi/shared';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { selectCurrentUser } from '../../../../state/current-user/current-user.selectors'; import { selectCurrentUser } from '../../../../state/current-user/current-user.selectors';

View File

@ -27,7 +27,7 @@ import { Client } from '../../../../service/client.service';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MoveComponentRequest, UpdateComponentRequest } from '../../state/flow'; import { MoveComponentRequest, UpdateComponentRequest } from '../../state/flow';
import { Position } from '../../state/shared'; import { Position } from '../../state/shared';
import { ComponentType } from 'libs/shared/src'; import { ComponentType } from '@nifi/shared';
import { ClusterConnectionService } from '../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../service/cluster-connection.service';
@Injectable({ @Injectable({

View File

@ -52,7 +52,7 @@ import { CanvasState } from '../state';
import * as d3 from 'd3'; import * as d3 from 'd3';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { CanvasView } from './canvas-view.service'; import { CanvasView } from './canvas-view.service';
import { ComponentType } from 'libs/shared/src'; import { ComponentType } from '@nifi/shared';
import { Client } from '../../../service/client.service'; import { Client } from '../../../service/client.service';
import { CopyRequestContext, CopyRequestEntity, CopyResponseEntity } from '../../../state/copy'; import { CopyRequestContext, CopyRequestEntity, CopyResponseEntity } from '../../../state/copy';
import { CopyPasteService } from './copy-paste.service'; import { CopyPasteService } from './copy-paste.service';

View File

@ -51,7 +51,7 @@ import {
terminateThreads, terminateThreads,
updatePositions updatePositions
} from '../state/flow/flow.actions'; } from '../state/flow/flow.actions';
import { ComponentType } from 'libs/shared/src'; import { ComponentType } from '@nifi/shared';
import { import {
ConfirmStopVersionControlRequest, ConfirmStopVersionControlRequest,
MoveComponentRequest, MoveComponentRequest,

View File

@ -32,9 +32,7 @@ import { initialState as initialFlowState } from '../state/flow/flow.reducer';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { BulletinsTip } from '../../../ui/common/tooltips/bulletins-tip/bulletins-tip.component'; import { BulletinsTip } from '../../../ui/common/tooltips/bulletins-tip/bulletins-tip.component';
import { BreadcrumbEntity, Position } from '../state/shared'; import { BreadcrumbEntity, Position } from '../state/shared';
import { ComponentType } from 'libs/shared/src'; import { BulletinEntity, ComponentType, NiFiCommon, ParameterContextReferenceEntity, Permissions } from '@nifi/shared';
import { BulletinEntity, ParameterContextReferenceEntity, Permissions } from '../../../state/shared';
import { NiFiCommon } from '@nifi/shared';
import { CurrentUser } from '../../../state/current-user'; import { CurrentUser } from '../../../state/current-user';
import { initialState as initialUserState } from '../../../state/current-user/current-user.reducer'; import { initialState as initialUserState } from '../../../state/current-user/current-user.reducer';
import { selectCurrentUser } from '../../../state/current-user/current-user.selectors'; import { selectCurrentUser } from '../../../state/current-user/current-user.selectors';

View File

@ -50,9 +50,8 @@ import {
UploadProcessGroupRequest, UploadProcessGroupRequest,
VersionControlInformationEntity VersionControlInformationEntity
} from '../state/flow'; } from '../state/flow';
import { ComponentType } from 'libs/shared/src';
import { Client } from '../../../service/client.service'; import { Client } from '../../../service/client.service';
import { NiFiCommon } from '@nifi/shared'; import { ComponentType, NiFiCommon } from '@nifi/shared';
import { ClusterConnectionService } from '../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../service/cluster-connection.service';
import { PropertyDescriptorRetriever } from '../../../state/shared'; import { PropertyDescriptorRetriever } from '../../../state/shared';

View File

@ -18,10 +18,9 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { NiFiCommon } from '@nifi/shared'; import { ComponentType, NiFiCommon } from '@nifi/shared';
import { ConfigureRemotePortRequest, ToggleRemotePortTransmissionRequest } from '../state/manage-remote-ports'; import { ConfigureRemotePortRequest, ToggleRemotePortTransmissionRequest } from '../state/manage-remote-ports';
import { Client } from '../../../service/client.service'; import { Client } from '../../../service/client.service';
import { ComponentType } from 'libs/shared/src';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class ManageRemotePortService { export class ManageRemotePortService {

View File

@ -40,11 +40,10 @@ import {
updateConnection updateConnection
} from '../../state/flow/flow.actions'; } from '../../state/flow/flow.actions';
import { UnorderedListTip } from '../../../../ui/common/tooltips/unordered-list-tip/unordered-list-tip.component'; import { UnorderedListTip } from '../../../../ui/common/tooltips/unordered-list-tip/unordered-list-tip.component';
import { ComponentType, SelectOption } from 'libs/shared/src';
import { Dimension, Position } from '../../state/shared'; import { Dimension, Position } from '../../state/shared';
import { loadBalanceStrategies, UpdateComponentRequest } from '../../state/flow'; import { loadBalanceStrategies, UpdateComponentRequest } from '../../state/flow';
import { filter, Subject, switchMap, takeUntil } from 'rxjs'; import { filter, Subject, switchMap, takeUntil } from 'rxjs';
import { NiFiCommon } from '@nifi/shared'; import { ComponentType, NiFiCommon, SelectOption } from '@nifi/shared';
import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service'; import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service';
import { ClusterConnectionService } from '../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../service/cluster-connection.service';

View File

@ -29,7 +29,7 @@ import {
selectTransitionRequired selectTransitionRequired
} from '../../state/flow/flow.selectors'; } from '../../state/flow/flow.selectors';
import { Dimension } from '../../state/shared'; import { Dimension } from '../../state/shared';
import { ComponentType } from 'libs/shared/src'; import { ComponentType } from '@nifi/shared';
import { filter, Subject, switchMap, takeUntil } from 'rxjs'; import { filter, Subject, switchMap, takeUntil } from 'rxjs';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })

View File

@ -32,10 +32,9 @@ import {
import { Client } from '../../../../service/client.service'; import { Client } from '../../../../service/client.service';
import { updateComponent } from '../../state/flow/flow.actions'; import { updateComponent } from '../../state/flow/flow.actions';
import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service'; import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service';
import { ComponentType } from 'libs/shared/src';
import { UpdateComponentRequest } from '../../state/flow'; import { UpdateComponentRequest } from '../../state/flow';
import { filter, Subject, switchMap, takeUntil } from 'rxjs'; import { filter, Subject, switchMap, takeUntil } from 'rxjs';
import { NiFiCommon } from '@nifi/shared'; import { ComponentType, NiFiCommon } from '@nifi/shared';
import { ClusterConnectionService } from '../../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../../service/cluster-connection.service';
@Injectable({ @Injectable({

View File

@ -30,10 +30,9 @@ import {
selectTransitionRequired selectTransitionRequired
} from '../../state/flow/flow.selectors'; } from '../../state/flow/flow.selectors';
import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service'; import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service';
import { TextTip, NiFiCommon } from '@nifi/shared'; import { ComponentType, TextTip, NiFiCommon } from '@nifi/shared';
import { ValidationErrorsTip } from '../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component'; import { ValidationErrorsTip } from '../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component';
import { Dimension } from '../../state/shared'; import { Dimension } from '../../state/shared';
import { ComponentType } from 'libs/shared/src';
import { filter, Subject, switchMap, takeUntil } from 'rxjs'; import { filter, Subject, switchMap, takeUntil } from 'rxjs';
import { renderConnectionsForComponent } from '../../state/flow/flow.actions'; import { renderConnectionsForComponent } from '../../state/flow/flow.actions';

View File

@ -32,9 +32,8 @@ import { CanvasUtils } from '../canvas-utils.service';
import { enterProcessGroup } from '../../state/flow/flow.actions'; import { enterProcessGroup } from '../../state/flow/flow.actions';
import { VersionControlTip } from '../../ui/common/tooltips/version-control-tip/version-control-tip.component'; import { VersionControlTip } from '../../ui/common/tooltips/version-control-tip/version-control-tip.component';
import { Dimension } from '../../state/shared'; import { Dimension } from '../../state/shared';
import { ComponentType } from 'libs/shared/src';
import { filter, Subject, switchMap, takeUntil } from 'rxjs'; import { filter, Subject, switchMap, takeUntil } from 'rxjs';
import { NiFiCommon, TextTip } from '@nifi/shared'; import { ComponentType, NiFiCommon, TextTip } from '@nifi/shared';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'

View File

@ -31,9 +31,8 @@ import {
} from '../../state/flow/flow.selectors'; } from '../../state/flow/flow.selectors';
import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service'; import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service';
import { ValidationErrorsTip } from '../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component'; import { ValidationErrorsTip } from '../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component';
import { TextTip, NiFiCommon } from '@nifi/shared'; import { ComponentType, TextTip, NiFiCommon } from '@nifi/shared';
import { Dimension } from '../../state/shared'; import { Dimension } from '../../state/shared';
import { ComponentType } from 'libs/shared/src';
import { filter, Subject, switchMap, takeUntil } from 'rxjs'; import { filter, Subject, switchMap, takeUntil } from 'rxjs';
@Injectable({ @Injectable({

View File

@ -32,9 +32,8 @@ import {
import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service'; import { QuickSelectBehavior } from '../behavior/quick-select-behavior.service';
import { ValidationErrorsTip } from '../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component'; import { ValidationErrorsTip } from '../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component';
import { Dimension } from '../../state/shared'; import { Dimension } from '../../state/shared';
import { ComponentType } from 'libs/shared/src';
import { filter, Subject, switchMap, takeUntil } from 'rxjs'; import { filter, Subject, switchMap, takeUntil } from 'rxjs';
import { NiFiCommon, TextTip } from '@nifi/shared'; import { ComponentType, NiFiCommon, TextTip } from '@nifi/shared';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'

View File

@ -29,7 +29,7 @@ import { selectParameterSaving, selectParameterState } from '../state/parameter/
import { ParameterState } from '../state/parameter'; import { ParameterState } from '../state/parameter';
import * as ErrorActions from '../../../state/error/error.actions'; import * as ErrorActions from '../../../state/error/error.actions';
import * as ParameterActions from '../state/parameter/parameter.actions'; import * as ParameterActions from '../state/parameter/parameter.actions';
import { MEDIUM_DIALOG } from 'libs/shared/src'; import { MEDIUM_DIALOG } from '@nifi/shared';
import { ClusterConnectionService } from '../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../service/cluster-connection.service';
import { ErrorHelper } from '../../../service/error-helper.service'; import { ErrorHelper } from '../../../service/error-helper.service';

View File

@ -68,7 +68,7 @@ export const controllerServiceAdvancedUiParamsResolver: ResolveFn<AdvancedUiPara
map((entity) => { map((entity) => {
const revision = client.getRevision(entity); const revision = client.getRevision(entity);
const editable = entity.status.runStatus === 'DISABLED'; const editable = entity.status.runStatus === 'DISABLED' && entity.permissions.canWrite;
return { return {
url: entity.component.customUiUrl, url: entity.component.customUiUrl,

View File

@ -66,10 +66,11 @@ export const processorAdvancedUiParamsResolver: ResolveFn<AdvancedUiParams> = (r
map((entity) => { map((entity) => {
const revision = client.getRevision(entity); const revision = client.getRevision(entity);
const editable = !( const editable =
entity.status.aggregateSnapshot.runStatus === 'Running' || !(
entity.status.aggregateSnapshot.activeThreadCount > 0 entity.status.aggregateSnapshot.runStatus === 'Running' ||
); entity.status.aggregateSnapshot.activeThreadCount > 0
) && entity.permissions.canWrite;
return { return {
url: entity.component.config.customUiUrl, url: entity.component.config.customUiUrl,

View File

@ -20,7 +20,7 @@ import { Observable } from 'rxjs';
import { HttpClient, HttpParams } from '@angular/common/http'; import { HttpClient, HttpParams } from '@angular/common/http';
import { Snippet, SnippetComponentRequest } from '../state/flow'; import { Snippet, SnippetComponentRequest } from '../state/flow';
import { ClusterConnectionService } from '../../../service/cluster-connection.service'; import { ClusterConnectionService } from '../../../service/cluster-connection.service';
import { ComponentType } from 'libs/shared/src'; import { ComponentType } from '@nifi/shared';
import { Client } from '../../../service/client.service'; import { Client } from '../../../service/client.service';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })

Some files were not shown because too many files have changed in this diff Show More