diff --git a/spring-shell-docs/readme.txt b/spring-shell-docs/readme.txt index 34e9a673..166e979a 100644 --- a/spring-shell-docs/readme.txt +++ b/spring-shell-docs/readme.txt @@ -2,6 +2,7 @@ Some info how screen recordings were made asciinema rec spring-shell-docs/src/main/asciidoc/asciinema/component-text-input-1.cast asciinema rec spring-shell-docs/src/main/asciidoc/asciinema/component-path-input-1.cast +asciinema rec spring-shell-docs/src/main/asciidoc/asciinema/component-path-search-1.cast asciinema rec spring-shell-docs/src/main/asciidoc/asciinema/component-confirmation-1.cast asciinema rec spring-shell-docs/src/main/asciidoc/asciinema/component-single-select-1.cast asciinema rec spring-shell-docs/src/main/asciidoc/asciinema/component-multi-select-1.cast @@ -14,6 +15,9 @@ svg-term \ svg-term \ --in spring-shell-docs/src/main/asciidoc/asciinema/component-path-input-1.cast \ --out spring-shell-docs/src/main/asciidoc/images/component-path-input-1.svg +svg-term \ + --in spring-shell-docs/src/main/asciidoc/asciinema/component-path-search-1.cast \ + --out spring-shell-docs/src/main/asciidoc/images/component-path-search-1.svg svg-term \ --in spring-shell-docs/src/main/asciidoc/asciinema/component-confirmation-1.cast \ --out spring-shell-docs/src/main/asciidoc/images/component-confirmation-1.svg diff --git a/spring-shell-docs/src/main/asciidoc/asciinema/component-path-search-1.cast b/spring-shell-docs/src/main/asciidoc/asciinema/component-path-search-1.cast new file mode 100644 index 00000000..50f9047f --- /dev/null +++ b/spring-shell-docs/src/main/asciidoc/asciinema/component-path-search-1.cast @@ -0,0 +1,23 @@ +{"version": 2, "width": 85, "height": 10, "timestamp": 1666162443, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} +[1.881363, "o", "java -jar spring-shell-samples/build/libs/spring-shell-samples.jar"] +[2.630692, "o", "\r\n"] +[6.50287, "o", "\u001b[?1h\u001b=\u001b[?2004h\u001b[33mmy-shell:>\u001b[0m"] +[8.347165, "o", "\u001b[1mcomponent path search\u001b[0m"] +[9.422581, "o", "\r\r\n\u001b[?1l\u001b>\u001b[?1000l\u001b[?2004l"] +[9.524556, "o", "\u001b[?1h\u001b=\u001b[?25l"] +[9.612905, "o", "\u001b[32;1m?\u001b[0m \u001b[1mEnter value\u001b[0m \u001b[70C \u001b[32mℹ\u001b[0m \u001b[32mType ' ' to search\u001b[0m\u001b[A\r"] +[10.889157, "o", "\u001b[14C.\r\r\n\u001b[35C\u001b[32m, 20/27\u001b[0m\u001b[42C \u001b[96;1m❯\u001b[0m\u001b[96;1m buildSrc/src\u001b[0m\u001b[70C \u001b[96;1mbuildSrc/src/main\u001b[0m\u001b[65C \u001b[96;1mbuildSrc/build.gradle\u001b[0m\u001b[61C \u001b[96;1mbuildSrc/src/main/java\u001b[0m\u001b[60C \u001b[96;1mbuildSrc/src/main/java/org\u001b[0m\u001b[6A\r"] +[12.272435, "o", "\u001b[15C \r"] +[12.486882, "o", "\u001b[16Cg\r\r\n\r\n\u001b[14C\u001b[96;1m/main/java/org/springframework/shell/\u001b[33;22mg\u001b[96;1mradle\u001b[0m\r\r\n\u001b[19C\u001b[96;1m/java/org/springframework/shell/\u001b[33;22mg\u001b[96;1mradle/BomPlugin.java\u001b[0m\r\r\n\u001b[11C\u001b[96;1msrc/main/java/org/springframework/shell/\u001b[33;22mg\u001b[96;1mradle/DocsPlugin.java\u001b[0m\u001b[K\r\r\n\u001b[24C\u001b[96;1m/org/springframework/shell/\u001b[33;22mg\u001b[96;1mradle/RootPlugin.java\u001b[0m\r\r\n\u001b[28C\u001b[96;1m/springframework/shell/\u001b[33;22mg\u001b[96;1mradle/ModulePlugin.java\u001b[0m\u001b[6A\r"] +[12.707385, "o", "\u001b[17Cr\r\r\n\r\n\u001b[52C\u001b[33mr\u001b[0m\r\r\n\u001b[52C\u001b[33mr\u001b[0m\r\r\n\u001b[52C\u001b[33mr\u001b[96;1madle/Root\u001b[0m\r\r\n\u001b[52C\u001b[33mr\u001b[96;1madle/Docs\u001b[0m\r\r\n\u001b[52C\u001b[33mr\u001b[96;1madle/Samp\u001b[0m\u001b[6A\r"] +[12.758464, "o", "\u001b[18Ca\r\r\n\r\n\u001b[53C\u001b[33ma\u001b[0m\r\r\n\u001b[53C\u001b[33ma\u001b[0m\r\r\n\u001b[53C\u001b[33ma\u001b[0m\r\r\n\u001b[53C\u001b[33ma\u001b[0m\r\r\n\u001b[53C\u001b[33ma\u001b[96;1mdle/Modu\u001b[0m\u001b[6A\r"] +[13.035614, "o", "\u001b[19Cd\r\r\n\u001b[37C\u001b[32m19\u001b[0m\r\r\n\u001b[54C\u001b[33md\u001b[0m\r\r\n\u001b[54C\u001b[33md\u001b[0m\r\r\n\u001b[54C\u001b[33md\u001b[96;1mle/Docs\u001b[0m\r\r\n\u001b[54C\u001b[33md\u001b[96;1mle/Module\u001b[0m\u001b[K\u001b[96;1mPlugin.java\u001b[0m\r\r\n\u001b[54C\u001b[33md\u001b[96;1mle/Samp\u001b[0m\u001b[6A\r"] +[13.132591, "o", "\u001b[20Cl\r\r\n\r\n\u001b[55C\u001b[33ml\u001b[0m\r\r\n\u001b[55C\u001b[33ml\u001b[0m\r\r\n\u001b[55C\u001b[33ml\u001b[0m\r\r\n\u001b[55C\u001b[33ml\u001b[96;1me/Samp\u001b[0m\r\r\n\u001b[55C\u001b[33ml\u001b[96;1me/Modu\u001b[0m\u001b[6A\r"] +[13.226949, "o", "\u001b[21Ce\r\r\n\r\n\u001b[56C\u001b[33me\u001b[0m\r\r\n\u001b[56C\u001b[33me\u001b[0m\r\r\n\u001b[56C\u001b[33me\u001b[0m\r\r\n\u001b[56C\u001b[33me\u001b[0m\r\r\n\u001b[56C\u001b[33me\u001b[0m\u001b[6A\r"] +[14.514777, "o", "\r\r\n\r\n \r\r\n\u001b[96;1m❯ \u001b[0m\u001b[3A\r"] +[15.008775, "o", "\r\r\n\r\n\u001b[96;1m❯ \u001b[0m\r\r\n \u001b[3A\r"] +[15.547301, "o", "\u001b[?1l\u001b>\u001b[?12;25h\u001b[K\r\r\n\u001b[K\r\r\n\u001b[K\r\r\n\u001b[K\r\r\n\u001b[K\r\r\n\u001b[K\r\r\n\u001b[K\u001b[6A"] +[15.552903, "o", "\u001b[32;1m?\u001b[0m \u001b[1mEnter value\u001b[0m \u001b[34mbuildSrc/src/main/java/org/springframework/shell/gradle\u001b[0m\r\n"] +[15.55352, "o", "Got value buildSrc/src/main/java/org/springframework/shell/gradle\r\n"] +[16.475016, "o", "\u001b[?1h\u001b=\u001b[?2004h\u001b[33mmy-shell:>\u001b[0m"] +[18.475016, "o", "\u001b[?1h\u001b=\u001b[?2004h\u001b[33mmy-shell:>\u001b[0m"] diff --git a/spring-shell-docs/src/main/asciidoc/images/component-path-search-1.svg b/spring-shell-docs/src/main/asciidoc/images/component-path-search-1.svg new file mode 100644 index 00000000..498b5be1 --- /dev/null +++ b/spring-shell-docs/src/main/asciidoc/images/component-path-search-1.svg @@ -0,0 +1 @@ +java-jarspring-shell-samples/build/libs/spring-shell-samples.jarmy-shell:>my-shell:>componentpathsearch?Entervalue.Type'<path><pattern>'tosearch,20/27buildSrc/srcbuildSrc/src/mainbuildSrc/build.gradlebuildSrc/src/main/javabuildSrc/src/main/java/orgType'<path><pattern>'tosearch,19/27?Entervalue.gradlebuildSrc/src/main/java/org/springframework/shell/gradlebuildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java?EntervaluebuildSrc/src/main/java/org/springframework/shell/gradleGotvaluebuildSrc/src/main/java/org/springframework/shell/gradle?EntervalueType'<path><pattern>'tosearch?Entervalue.gbuildSrc/src/main/java/org/springframework/shell/gradlebuildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/RootPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java?Entervalue.grbuildSrc/src/main/java/org/springframework/shell/gradlebuildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/RootPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java?Entervalue.grabuildSrc/src/main/java/org/springframework/shell/gradlebuildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/RootPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.java?Entervalue.gradbuildSrc/src/main/java/org/springframework/shell/gradlebuildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.java?Entervalue.gradlbuildSrc/src/main/java/org/springframework/shell/gradlebuildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/DocsPlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/SamplePlugin.javabuildSrc/src/main/java/org/springframework/shell/gradle/ModulePlugin.javabuildSrc/src/main/java/org/springframework/shell/gradlebuildSrc/src/main/java/org/springframework/shell/gradle/BomPlugin.javamy-shell:>my-shell:> \ No newline at end of file diff --git a/spring-shell-docs/src/main/asciidoc/using-shell-components-ui-pathsearch.adoc b/spring-shell-docs/src/main/asciidoc/using-shell-components-ui-pathsearch.adoc new file mode 100644 index 00000000..d383a882 --- /dev/null +++ b/spring-shell-docs/src/main/asciidoc/using-shell-components-ui-pathsearch.adoc @@ -0,0 +1,32 @@ +[[using-shell-components-ui-pathsearch]] +==== Path Search +ifndef::snippets[:snippets: ../../test/java/org/springframework/shell/docs] + +The path search component asks base directory for scan and optional search expression. +Results are shown in a single select list where user can pick a path. +`PathSearchConfig` can be used to customise component behaviour. + +==== +[source, java, indent=0] +---- +include::{snippets}/UiComponentSnippets.java[tag=snippet9] +---- +==== + +The following image shows typical output from a path search component: + +image::images/component-path-search-1.svg[text input] + +The context object is `PathSearchContext`. The following table describes its context variables: + +[[pathsearchcontext-template-variables]] +.PathSearchContext Template Variables +|=== +|Key |Description + +|`pathViewItems` +|The items available for rendering search results. + +|`model` +|The parent context variables (see <>). +|=== diff --git a/spring-shell-docs/src/main/asciidoc/using-shell-components-ui.adoc b/spring-shell-docs/src/main/asciidoc/using-shell-components-ui.adoc index 5fc42440..a2a08a1f 100644 --- a/spring-shell-docs/src/main/asciidoc/using-shell-components-ui.adoc +++ b/spring-shell-docs/src/main/asciidoc/using-shell-components-ui.adoc @@ -27,6 +27,8 @@ include::using-shell-components-ui-stringinput.adoc[] include::using-shell-components-ui-pathinput.adoc[] +include::using-shell-components-ui-pathsearch.adoc[] + include::using-shell-components-ui-confirmation.adoc[] include::using-shell-components-ui-singleselect.adoc[] diff --git a/spring-shell-docs/src/test/java/org/springframework/shell/docs/UiComponentSnippets.java b/spring-shell-docs/src/test/java/org/springframework/shell/docs/UiComponentSnippets.java index 806416e9..c9b74217 100644 --- a/spring-shell-docs/src/test/java/org/springframework/shell/docs/UiComponentSnippets.java +++ b/spring-shell-docs/src/test/java/org/springframework/shell/docs/UiComponentSnippets.java @@ -28,11 +28,14 @@ import org.jline.utils.AttributedStringBuilder; import org.springframework.shell.component.ConfirmationInput; import org.springframework.shell.component.MultiItemSelector; import org.springframework.shell.component.PathInput; +import org.springframework.shell.component.PathSearch; import org.springframework.shell.component.SingleItemSelector; import org.springframework.shell.component.StringInput; import org.springframework.shell.component.ConfirmationInput.ConfirmationInputContext; import org.springframework.shell.component.MultiItemSelector.MultiItemSelectorContext; import org.springframework.shell.component.PathInput.PathInputContext; +import org.springframework.shell.component.PathSearch.PathSearchConfig; +import org.springframework.shell.component.PathSearch.PathSearchContext; import org.springframework.shell.component.SingleItemSelector.SingleItemSelectorContext; import org.springframework.shell.component.StringInput.StringInputContext; import org.springframework.shell.component.support.SelectorItem; @@ -109,7 +112,7 @@ public class UiComponentSnippets { @ShellComponent public class ComponentCommands extends AbstractShellComponent { - @ShellMethod(key = "component path", value = "Path input", group = "Components") + @ShellMethod(key = "component path input", value = "Path input", group = "Components") public String pathInput() { PathInput component = new PathInput(getTerminal(), "Enter value"); component.setResourceLoader(getResourceLoader()); @@ -211,4 +214,28 @@ public class UiComponentSnippets { } } + class Dump8 { + @ShellComponent + public class ComponentCommands extends AbstractShellComponent { + + @ShellMethod(key = "component path input", value = "Path search", group = "Components") + public String pathSearch() { + // tag::snippet9[] + PathSearchConfig config = new PathSearch.PathSearchConfig(); + config.setMaxPathsShow(5); + config.setMaxPathsSearch(100); + config.setSearchForward(true); + config.setSearchCaseSensitive(false); + config.setSearchNormalize(false); + + PathSearch component = new PathSearch(getTerminal(), "Enter value", config); + component.setResourceLoader(getResourceLoader()); + component.setTemplateExecutor(getTemplateExecutor()); + + PathSearchContext context = component.run(PathSearchContext.empty()); + return "Got value " + context.getResultValue(); + // end::snippet9[] + } + } + } }