diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..d08b67e
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,7 @@
+; Top-most EditorConfig file
+root = true
+
+; 4-column space indentation
+[*]
+indent_style = space
+indent_size = 4
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..7ff0529
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,17 @@
+*.cs text=auto diff=csharp
+*.html text=auto
+*.htm text=auto
+*.css text=auto
+*.scss text=auto
+*.sass text=auto
+*.less text=auto
+*.js text=auto
+*.sql text=auto
+*.ttf -text diff
+*.eot -text diff
+*.woff -text diff
+*.woff2 -text diff
+*.csproj text=auto merge=union
+*.sln text=auto eol=crlf merge=union
+
+*.item -text
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f6244b2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,49 @@
+JointCommissionEnterprise-no-vanilla.sln
+[Oo]bj/
+src/**/[Bb]in/
+specs/**/[Bb]in/
+.nuget/
+Deploy/
+_ReSharper.*
+packages/
+artifacts/
+*.user
+*.cache
+*.suo
+*.userprefs
+*DS_Store
+*.sln.ide
+lib/System/*
+!lib/System/readme.MD
+!lib/Sitecore.Common/*
+!lib/Sitecore.Support/*
+!lib/Sitecore.XA/*
+!lib/Sitecore.EXM/*
+!lib/Coveo/*
+!lib/S4S/*
+!vendor/*
+!vendor/sitecore_modules/**
+!vendor/sitecore_patches/**
+!scripts/Unicorn/MicroCHAP.dll
+!src/Foundation/Installer/code/App_Data/**
+.sonar
+vars.user.cmd
+/.vs
+/target
+/node_modules
+temp/
+*.ncrunchproject
+*.ncrunchsolution
+.vscode
+nCrunchTemp*.*
+optimized-min.yml
+/src/feature/IdevProductImport/IdevProductImport
+$tf/
+/reference/References.txt
+/src/feature/ContentImport/code/FixSummaries.aspx.designer.cs
+/src/feature/ContentImport/code/FixSummaries.aspx.cs
+/src/feature/ContentImport/code/FixSummaries.aspx
+/src/Project/Common/code/CreateCountries.aspx.designer.cs
+/src/Project/Common/code/CreateCountries.aspx.cs
+/src/Project/Common/code/CreateCountries.aspx
+/src/Foundation/DesignBot/code/.vs/Community.Foundation.DesignBot/v15/Server/sqlite3
diff --git a/Community.Foundation.DesignBot.sln b/Community.Foundation.DesignBot.sln
new file mode 100644
index 0000000..329fb0c
--- /dev/null
+++ b/Community.Foundation.DesignBot.sln
@@ -0,0 +1,30 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.102
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Community.Foundation.DesignBot", "src\Foundation\DesignBot\code\Community.Foundation.DesignBot.csproj", "{3DA98685-0E06-489F-87DC-A941021DB009}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReadMe", "ReadMe", "{88DB2195-6B03-45AB-B2DC-92A075D5C825}"
+ ProjectSection(SolutionItems) = preProject
+ README.md = README.md
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3DA98685-0E06-489F-87DC-A941021DB009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3DA98685-0E06-489F-87DC-A941021DB009}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3DA98685-0E06-489F-87DC-A941021DB009}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3DA98685-0E06-489F-87DC-A941021DB009}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {E439BEAA-4949-4E71-A9DB-EEF030434729}
+ EndGlobalSection
+EndGlobal
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
index 1b753ef..fa9c3c4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,31 @@
-# Community.Foundation.DesignBot
-Automate bulk design changes to Sitecore presentation details
+Sitecore - DesignBot
+==============
+
+Summary
+--------------
+Automate bulk design changes to Sitecore presentation details. This leverages Sitecore's rule editor field for savvy users to define design changes with pre-loaded Sitecore rule editor. These user programs can be applied to a single item or include any number of child levels, available in the Context menu of a selected item.
+
+Dependencies
+--------------
+This module requires previous installation of Sitecore Powershell Extension (SPE) Module. SPE is used for the simplicity of adding a context menu option and dialogs.
+
+Usage
+--------------
+1. Define Design Program
+![alt text](https://github.com/digitalParkour/Community.Foundation.DesignBot/raw/master/screenshots/Define.png "Define Design Program")
+
+2. Apply Program to select items
+![alt text](https://github.com/digitalParkour/Community.Foundation.DesignBot/raw/master/screenshots/Apply.png "Apply Design Program")
+
+Installation
+--------------
+Either:
+* Install Sitecore package. [See Releases](https://github.com/digitalParkour/Community.Foundation.DesignBot/releases).
+ > For CM or Standalone instances only.
+
+Or:
+1. Include this project in your Helix style solution
+2. Update NuGet references to match target sitecore version
+3. Sync unicorn data or install sitecore package
+ > Expects Unicorn 4+ in your solution.
+ > If not using Unicorn, disable Foundation.RemoteCacheKick.Serialization.config
\ No newline at end of file
diff --git a/publishsettings.targets b/publishsettings.targets
new file mode 100644
index 0000000..c415bd9
--- /dev/null
+++ b/publishsettings.targets
@@ -0,0 +1,5 @@
+
+
+ http://community.local
+
+
\ No newline at end of file
diff --git a/releases/Community-Foundation-DesignBot-1.0.0.zip b/releases/Community-Foundation-DesignBot-1.0.0.zip
new file mode 100644
index 0000000..784b2b1
Binary files /dev/null and b/releases/Community-Foundation-DesignBot-1.0.0.zip differ
diff --git a/releases/Community-Foundation-DesignBot.xml b/releases/Community-Foundation-DesignBot.xml
new file mode 100644
index 0000000..2c34a90
--- /dev/null
+++ b/releases/Community-Foundation-DesignBot.xml
@@ -0,0 +1,192 @@
+
+
+
+ Community-Foundation-DesignBot
+ james.gregory@americaneagle.com
+ 1.0.0
+
+
+
+
+ Community.Foundation.DesignBot 1.0
+
+** Requires Sitecore Powershell Extension (SPE) Module to be installed first.
+
+For CM or Standalone instances only.
+
+After installing you will create bot scripts by adding items and editing rules field under /sitecore/system/Settings/Rules/DesignBot/
+
+Remember to clear selections consistently; either always first or always last on each rule set.
+
+Run your bot script on any item in the content tree (and optionally N levels under it) but right clicking the item in Content editor and selecting the DesignBot context option.
+
+To customize rule and action options further, download source code from GitHub.
+
+===============================================
+This package installs the following files:
+===============================================
+\App_Config\Include\Foundation\Foundation.DesignBot.config
+\bin\Community.Foundation.DesignBot.dll
+\bin\Community.Foundation.DesignBot.pdb
+
+===============================================
+This package installs the following data items:
+===============================================
+/sitecore/Templates/Foundation/DesignBot/*
+/sitecore/system/Settings/Rules/Definitions/Tags/DesignBot/*
+/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/*
+/sitecore/system/Settings/Rules/DesignBot
+/sitecore/system/Modules/PowerShell/Script Library/DesignBot/*
+
+
+
+
+
+ True
+
+
+
+ /master/sitecore/templates/Foundation/DesignBot/{562609B4-311F-4D1F-AC86-60FFD699732A}/invariant/0
+ /master/sitecore/templates/Foundation/DesignBot/DesignBot Program/__Standard Values/{55742B6E-33DF-4598-A09D-D90A89B84837}/invariant/0
+ /master/sitecore/templates/Foundation/DesignBot/DesignBot Program/{341B47CA-10DE-471E-B82D-D7FBB5C48877}/invariant/0
+ /master/sitecore/templates/Foundation/DesignBot/Program Rule/__Standard Values/{809C0ECE-2D8F-4230-858A-983927436822}/invariant/0
+ /master/sitecore/templates/Foundation/DesignBot/Program Rule/{14F9A24A-5697-40AD-A429-6558A90D5F5B}/invariant/0
+ /master/sitecore/templates/Foundation/DesignBot/Program Rule/Data/{12D9D41D-06E7-4CA1-B985-D6CE6F0DBA16}/invariant/0
+ /master/sitecore/templates/Foundation/DesignBot/Program Rule/Data/Name/{406FEF24-0886-49C5-86D2-FBABF9CEB860}/invariant/0
+ /master/sitecore/templates/Foundation/DesignBot/Program Rule/Data/Rule/{709404DE-B4A9-46DC-A0EF-D1C7734454AD}/invariant/0
+
+ False
+
+
+
+
+
+
+
+ Templates
+
+
+
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/{42D05B0F-1F29-4E64-9AA1-C65D6DF7CF9E}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Clear Descendants Field/{1F2F1418-BE5F-44C3-8568-B0842F43CCA7}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Clear Field/{100EF220-FD5A-4B44-80CD-2102CAE5DE3B}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Set Descendants Field/{21D10AC5-387B-44E2-8751-45421E505CDF}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Set Field/{A187D372-48A9-43A6-8320-952BAC707829}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Swap Field Values/{A73D754F-7881-48C9-96C9-CE0656B4E85B}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Placeholder match/{37411546-0E80-461E-906C-99B68954C044}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Placeholder/{FE2BE19F-00AD-477B-BDE8-1BD11A93E49B}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering in Placeholder with Param/{E7788FB8-D0EE-4706-9A76-FE758F2593B3}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering in Placeholder/{ACF62966-1540-4796-87AA-D9E241F36111}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering with Placeholder/{62E3ACAE-744D-4E25-9E5F-58772741219E}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering/{4689B214-864A-42D3-B54E-99BB0FEEFE54}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Append Term/{CC76D5FA-8E31-4783-B7F5-50FC4EAFF891}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Clear/{9945789E-2BAC-4E02-8A61-CCCA46177599}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Remove Term/{CF689289-9E4B-4C59-BBD9-BDA5CA412AD0}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Set/{90DB2B4B-3E5C-4F9D-8EB3-F386347F4F6A}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - All in Placeholder/{BFFEC3F4-9F8A-470E-A454-D8FC52531E9C}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - All/{B0C976E8-B99F-437C-9DFE-3E67A17A3BC4}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Clear/{CD96BA64-565D-4584-B35B-EADEA1FAEEA0}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Device/{3A2C8EBB-0327-4126-AC5F-768D7F6849EB}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First in Placeholder/{E6FFFCB3-835D-48B3-926C-271C2E6949FF}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First Rendering by Placeholder and Param/{917B87C4-B6E9-46E6-9DEE-B92A5BC12FC9}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First Rendering by Placeholder/{63B97D48-8E7A-489E-86BF-FF9444CD5206}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First Rendering/{5EC49499-AD66-4A5F-AAAA-146B9537FDD2}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Inverse/{08EDC6BB-8731-46B3-AC60-DFA3CD4D27E7}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Last in Placeholder/{3AFEF4D3-3FAF-414A-BF78-242D0600A50D}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Last Rendering by Placeholder/{C82515EC-2DE3-4D3B-A580-6474084EE311}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Last Rendering/{40FBEF4A-CB7C-499C-8F5D-6DB5989E8606}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Placeholder match/{1B345278-CC26-4891-B4AD-807FDAC06BAE}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Placeholder with Range/{5D1EFFD9-6F2E-48BA-A5EA-E168E8913854}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Rendering by Param/{3AF43C06-B6CB-437B-B48A-20B8911EBAF4}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Rendering by Placeholder and Param/{34F53FDD-0C99-4DA0-A46B-7D60B3F21FD8}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Rendering by Placeholder match/{50291657-5B6E-4E5C-9193-81373D44801D}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings by Datasource Field/{2F8DE26B-717F-41F8-825A-8E5924F7D8F5}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings by Placeholder with Range/{082B6ED4-980B-47F5-BF40-92DFD8D9553A}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings by Placeholder/{BE6DC7B3-27DF-4358-BB0E-B8C7381407C2}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings/{0331ED24-FA79-4B6D-B6D6-C17915BC3671}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - move to/{AB0A78CD-7161-4863-B642-0FE15EEE923F}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - remove segment/{47E77A7D-30AB-46F7-B595-E14C59F826E4}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - set/{B67F50CC-C697-43CC-B93F-3A6CC5F78FF2}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - swap/{0A7F150B-9493-43AD-96C7-9E3384861B2E}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - move before/{E42E1445-9ACE-4723-9758-16D5C08B0899}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - move to front/{686DF7A5-B696-4A9C-9A12-7A85CD98063A}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - move/{9A0C8D71-BDC8-4BBB-9CB3-79DFC0A50100}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - remove all selected/{64C1A868-174E-4E51-8B52-439A03B34C12}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - remove certain selected/{D4A104D7-5444-46F4-AA50-40B66DC2EF98}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - sort by placeholder paths/{BCBB6A02-3BF9-419A-9E4F-97297D20DFB6}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Tags/{949A9512-86AF-4022-94F3-42F1F4DCBAA8}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Tags/Default/{6882785B-6821-4702-9093-9BB28FD59436}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Visibility/{9419E4CF-F545-49C2-82C5-C3AF5A1A50FD}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Tags/DesignBot/{CA29398A-ED15-4723-B025-05D4EC12E629}/invariant/0
+ /master/sitecore/system/Settings/Rules/Definitions/Tags/DesignBot/Visibility/{5FD62B6E-B08A-4A6A-945D-599734965444}/invariant/0
+ /master/sitecore/system/Settings/Rules/DesignBot/{AEBC97C1-8E3C-4073-A849-83569CDEDD6F}/invariant/0
+ /master/sitecore/system/Settings/Rules/DesignBot/Rules/{A6FC9765-0343-4F2A-A20D-3C9FA895996D}/invariant/0
+ /master/sitecore/system/Settings/Rules/DesignBot/Tags/{61C64655-9D11-4894-8E8C-4121A7C4C1E8}/invariant/0
+ /master/sitecore/system/Settings/Rules/DesignBot/Tags/Default/{BBE87145-474A-438A-BE6D-A4D797A71D34}/invariant/0
+
+ False
+
+
+
+
+
+
+
+ Rules
+
+
+
+ /master/sitecore/system/Modules/PowerShell/Script Library/DesignBot/{09EB22CA-E0A4-47AB-A293-E9EA537E9F99}/invariant/0
+ /master/sitecore/system/Modules/PowerShell/Script Library/DesignBot/Content Editor/{34982275-72AB-40F8-8029-B0D2DF906438}/invariant/0
+ /master/sitecore/system/Modules/PowerShell/Script Library/DesignBot/Content Editor/Context Menu/{86317DF1-C537-4C03-8F19-53A3786E19F2}/invariant/0
+ /master/sitecore/system/Modules/PowerShell/Script Library/DesignBot/Content Editor/Context Menu/DesignBot/{957AE84F-A008-476B-B3A1-E34DE543A950}/invariant/0
+
+ False
+
+
+
+
+
+
+
+ Context Menu
+
+
+
+ /bin/Community.Foundation.DesignBot.dll
+ /bin/Community.Foundation.DesignBot.pdb
+
+
+
+ /
+
+
+
+
+
+ dlls
+
+
+
+ /App_Config/Include/Foundation/Foundation.DesignBot.config
+
+
+
+ /
+
+
+
+
+
+ Config
+
+
+
+
+
+
+
+
+
+
+
diff --git a/screenshots/Apply.png b/screenshots/Apply.png
new file mode 100644
index 0000000..111b783
Binary files /dev/null and b/screenshots/Apply.png differ
diff --git a/screenshots/Define.png b/screenshots/Define.png
new file mode 100644
index 0000000..48835fa
Binary files /dev/null and b/screenshots/Define.png differ
diff --git a/src/Foundation/DesignBot/code/App_Config/Include/Foundation/Foundation.DesignBot.Serialization.config b/src/Foundation/DesignBot/code/App_Config/Include/Foundation/Foundation.DesignBot.Serialization.config
new file mode 100644
index 0000000..c650882
--- /dev/null
+++ b/src/Foundation/DesignBot/code/App_Config/Include/Foundation/Foundation.DesignBot.Serialization.config
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/App_Config/Include/Foundation/Foundation.DesignBot.config b/src/Foundation/DesignBot/code/App_Config/Include/Foundation/Foundation.DesignBot.config
new file mode 100644
index 0000000..de51f77
--- /dev/null
+++ b/src/Foundation/DesignBot/code/App_Config/Include/Foundation/Foundation.DesignBot.config
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Community.Foundation.DesignBot.csproj b/src/Foundation/DesignBot/code/Community.Foundation.DesignBot.csproj
new file mode 100644
index 0000000..2f3902f
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Community.Foundation.DesignBot.csproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+ Debug
+ AnyCPU
+
+
+ 2.0
+ {3DA98685-0E06-489F-87DC-A941021DB009}
+ {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+ Library
+ Properties
+ Community.Foundation.DesignBot
+ Community.Foundation.DesignBot
+ v4.6.2
+ true
+
+
+
+
+
+
+
+
+
+
+ true
+ full
+ false
+ bin\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ true
+ pdbonly
+ true
+ bin\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\..\..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.5\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
+
+
+
+ ..\..\..\..\packages\Sitecore.ContentTesting.NoReferences.8.2.171121\lib\NET452\Sitecore.ContentTesting.dll
+
+
+ ..\..\..\..\packages\Sitecore.Kernel.NoReferences.8.2.171121\lib\NET452\Sitecore.Kernel.dll
+
+
+ ..\..\..\..\packages\Sitecore.Logging.NoReferences.8.2.171121\lib\NET452\Sitecore.Logging.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Web.config
+
+
+ Web.config
+
+
+
+
+ 10.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+
+
+
+
+
+
+
+
+ False
+ True
+ 50713
+ /
+ http://localhost:50713/
+ False
+ True
+ http://tjc.local
+ False
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Comparer/RenderingComparer.cs b/src/Foundation/DesignBot/code/Comparer/RenderingComparer.cs
new file mode 100644
index 0000000..f9f80f1
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Comparer/RenderingComparer.cs
@@ -0,0 +1,25 @@
+using Sitecore;
+using Sitecore.Layouts;
+using System.Collections;
+
+namespace Community.Foundation.DesignBot.Comparer
+{
+ public class RenderingComparer : IComparer
+ {
+ public int Compare(RenderingDefinition x, RenderingDefinition y)
+ {
+ if (x == null || y == null)
+ return 0;
+
+ return string.Compare(
+ StringUtil.EnsurePrefix('/', x.Placeholder),
+ StringUtil.EnsurePrefix('/', y.Placeholder)
+ );
+ }
+
+ public int Compare(object x, object y)
+ {
+ return Compare(x as RenderingDefinition, y as RenderingDefinition);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Constants/Items.cs b/src/Foundation/DesignBot/code/Constants/Items.cs
new file mode 100644
index 0000000..4a2fe43
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Constants/Items.cs
@@ -0,0 +1,10 @@
+namespace Community.Foundation.DesignBot.Constants
+{
+ public struct Items
+ {
+ public struct Device
+ {
+ public const string DefaultId = "{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}";
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Extensions/ItemExtensions.cs b/src/Foundation/DesignBot/code/Extensions/ItemExtensions.cs
new file mode 100644
index 0000000..2941113
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Extensions/ItemExtensions.cs
@@ -0,0 +1,36 @@
+using Sitecore;
+using Sitecore.Data.Items;
+
+namespace Community.Foundation.DesignBot.Extensions
+{
+ public static class ItemExtensions
+ {
+ ///
+ /// Add version, select and return that new version, match workflow state
+ ///
+ ///
+ ///
+ public static Item AsNewVersion(this Item item, bool matchWorkflowState = false) {
+ // save current workflow state
+ var workflowState = item[FieldIDs.WorkflowState];
+ var workflow = item[FieldIDs.Workflow];
+
+ item.Versions.AddVersion();
+ // Now get new Version
+ item = item.Database.GetItem(item.ID);
+
+ // Match workflow
+ if (matchWorkflowState && item[FieldIDs.WorkflowState] != workflowState)
+ {
+ item.Editing.BeginEdit();
+ {
+ item[FieldIDs.Workflow] = workflow;
+ item[FieldIDs.WorkflowState] = workflowState;
+ }
+ item.Editing.EndEdit();
+ }
+
+ return item;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Extensions/RenderingExtensions.cs b/src/Foundation/DesignBot/code/Extensions/RenderingExtensions.cs
new file mode 100644
index 0000000..8626f19
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Extensions/RenderingExtensions.cs
@@ -0,0 +1,27 @@
+using Sitecore.Data;
+using Sitecore.Data.Items;
+using Sitecore.Layouts;
+
+namespace Community.Foundation.DesignBot.Extensions
+{
+ public static class RenderingExtensions
+ {
+
+ public static Item GetDatasourceItem(this RenderingDefinition rendering, Item page) {
+
+ var db = page?.Database;
+
+ // Handle SXA style datasources
+ if (page != null && rendering.Datasource.StartsWith("local:"))
+ {
+ // Build absolute path from relative path
+ return db?.GetItem($"{page.Paths.FullPath}{rendering.Datasource.Remove(0, "local:".Length)}");
+ }
+
+ ID dataId;
+ return ID.TryParse(rendering.Datasource, out dataId)
+ ? db?.GetItem(dataId) // by ID
+ : db?.GetItem(rendering.Datasource); // by Path
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Logging/BotLog.cs b/src/Foundation/DesignBot/code/Logging/BotLog.cs
new file mode 100644
index 0000000..f0651c0
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Logging/BotLog.cs
@@ -0,0 +1,16 @@
+using log4net;
+
+namespace Community.Foundation.DesignBot
+{
+ public static class BotLog
+ {
+ private static ILog log;
+ public static ILog Log
+ {
+ get
+ {
+ return log ?? (log = Sitecore.Diagnostics.LoggerFactory.GetLogger(typeof(BotLog)));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Properties/AssemblyInfo.cs b/src/Foundation/DesignBot/code/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..4b39e2a
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Community.Foundation.DesignBot")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Community.Foundation.DesignBot")]
+[assembly: AssemblyCopyright("Copyright © 2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3da98685-0e06-489f-87dc-a941021db009")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/Foundation/DesignBot/code/Properties/PublishProfiles/Local.pubxml b/src/Foundation/DesignBot/code/Properties/PublishProfiles/Local.pubxml
new file mode 100644
index 0000000..2739d01
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Properties/PublishProfiles/Local.pubxml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+ FileSystem
+ Debug
+ Any CPU
+
+ True
+ False
+ False
+
+
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/ClearPicks.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/ClearPicks.cs
new file mode 100644
index 0000000..dff8eb7
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/ClearPicks.cs
@@ -0,0 +1,22 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class ClearPicks : RuleAction
+ where T : DesignBotRuleContext
+ {
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ BotLog.Log.Info($"PICK - cleared picks");
+ Log.Info($"DESIGNBOT:: PICK - cleared picks", this);
+ ruleContext.SelectedRenderings.Clear();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/InvertSelection.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/InvertSelection.cs
new file mode 100644
index 0000000..71e7ad9
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/InvertSelection.cs
@@ -0,0 +1,25 @@
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class InvertSelection : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ BotLog.Log.Info($"PICK - inverted picks");
+ Log.Info($"DESIGNBOT:: PICK - inverted picks", this);
+
+ ruleContext.SelectedRenderings = ruleContext.SelectedDevice.Renderings.Cast()
+ .Where(x => !ruleContext.SelectedRenderings.Any(i => i.UniqueId == x.UniqueId)).ToList();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickAll.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickAll.cs
new file mode 100644
index 0000000..9d55808
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickAll.cs
@@ -0,0 +1,24 @@
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class PickAll : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ BotLog.Log.Info($"PICK - picked all renderings");
+ Log.Info($"DESIGNBOT:: PICK - picked all renderings", this);
+
+ ruleContext.SelectedRenderings = ruleContext.SelectedDevice.Renderings.Cast().ToList();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickDevice.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickDevice.cs
new file mode 100644
index 0000000..ce0a516
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickDevice.cs
@@ -0,0 +1,23 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ public class PickDevice : RuleAction where T : DesignBotRuleContext
+ {
+ public string DeviceId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, nameof(ruleContext));
+
+ if (string.IsNullOrWhiteSpace(DeviceId))
+ return;
+
+ BotLog.Log.Info($"PICK - picked device");
+ Log.Info($"DESIGNBOT:: PICK - picked device", this);
+ ruleContext.SelectedDevice = ruleContext.FinalLayout.GetDevice(DeviceId);
+ }
+ }
+}
+
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickFirstRendering.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickFirstRendering.cs
new file mode 100644
index 0000000..14f13d5
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickFirstRendering.cs
@@ -0,0 +1,14 @@
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class PickFirstRendering : PickRenderings
+ where T : DesignBotRuleContext
+ {
+ public PickFirstRendering()
+ {
+ First = true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickLastRendering.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickLastRendering.cs
new file mode 100644
index 0000000..ac8085a
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickLastRendering.cs
@@ -0,0 +1,14 @@
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class PickLastRendering : PickRenderings
+ where T : DesignBotRuleContext
+ {
+ public PickLastRendering()
+ {
+ Last = true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickRenderings.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickRenderings.cs
new file mode 100644
index 0000000..178dbb5
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickRenderings.cs
@@ -0,0 +1,142 @@
+using Community.Foundation.DesignBot.Extensions;
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using Sitecore.Rules.Conditions;
+using Sitecore.Text;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class PickRenderings : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string PlaceholderPath { get; set; }
+ public string RenderingId { get; set; }
+
+ public bool First { get; set; }
+ public bool Last { get; set; }
+ public int Skip { get; set; }
+ public int Take { get; set; }
+
+ public string Param { get; set; }
+ public ID DsFieldId { get; set; }
+ public string Value { get; set; }
+ public string OperatorId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ var renderings = ruleContext.SelectedDevice.Renderings.Cast().ToList();
+ if (!string.IsNullOrWhiteSpace(PlaceholderPath))
+ {
+ renderings = renderings.Where(x => x.Placeholder.Equals(PlaceholderPath, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+ if (!string.IsNullOrWhiteSpace(RenderingId))
+ {
+ renderings = renderings.Where(x => x.ItemID.Equals(RenderingId, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+ if (!string.IsNullOrWhiteSpace(Param))
+ {
+ renderings = renderings.Where(MatchesParamCriteria).ToList();
+ }
+ if (DsFieldId != (ID)null)
+ {
+ var qIds = new List();
+ foreach(var r in renderings)
+ {
+ var dsItem = r.GetDatasourceItem(ruleContext.Item);
+ if (dsItem == null)
+ continue;
+ // Special Empty case (shortcut)
+ if (Value.Equals("EMPTY", StringComparison.OrdinalIgnoreCase))
+ {
+ if (string.IsNullOrWhiteSpace(dsItem[DsFieldId]))
+ {
+ qIds.Add(r.UniqueId);
+ }
+ }
+ else if (dsItem[DsFieldId] != null && Compare(dsItem[DsFieldId], Value))
+ {
+ qIds.Add(r.UniqueId);
+ }
+ }
+ renderings = renderings.Where(x => qIds.Contains(x.UniqueId)).ToList();
+ }
+
+ if (renderings.Any())
+ {
+ if (First)
+ {
+ var r = renderings.First();
+ if (!ruleContext.SelectedRenderings.Any(x=>x.UniqueId.Equals(r.UniqueId)))
+ ruleContext.SelectedRenderings.Add(r);
+ }
+ else if (Last)
+ {
+ var r = renderings.Last();
+ if (!ruleContext.SelectedRenderings.Any(x => x.UniqueId.Equals(r.UniqueId)))
+ ruleContext.SelectedRenderings.Add(r);
+ }
+ else if (Take > 0)
+ {
+ foreach(var r in renderings.Skip(Skip).Take(Take) )
+ {
+ if (!ruleContext.SelectedRenderings.Any(x => x.UniqueId.Equals(r.UniqueId)))
+ ruleContext.SelectedRenderings.Add(r);
+ }
+ }
+ else
+ {
+ foreach (var r in renderings)
+ {
+ if (!ruleContext.SelectedRenderings.Any(x => x.UniqueId.Equals(r.UniqueId)))
+ ruleContext.SelectedRenderings.Add(r);
+ }
+ }
+ }
+
+ BotLog.Log.Info($"PICK - Attempted Add... Current Selection({ruleContext.SelectedRenderings.Count}): {string.Join(",",ruleContext.SelectedRenderings.Select(x=>x.UniqueId))}");
+ Log.Info($"DESIGNBOT:: PICK - Attempted Add... Current Selection({ruleContext.SelectedRenderings.Count}): {string.Join(",", ruleContext.SelectedRenderings.Select(x => x.UniqueId))}", this);
+ }
+
+
+ protected bool MatchesParamCriteria(RenderingDefinition r)
+ {
+ var urlString = new UrlString(r.Parameters);
+ if (string.IsNullOrWhiteSpace(urlString[Param]))
+ return false;
+ return Compare(HttpUtility.UrlDecode(urlString[Param]), HttpUtility.UrlDecode(Value));
+ }
+
+ ///
+ /// Compares the specified value0.
+ ///
+ /// The value0.
+ /// The value1.
+ /// The boolean.
+ protected bool Compare(string value0, string value1)
+ {
+ Assert.ArgumentNotNull(value0, "value0");
+ Assert.ArgumentNotNull(value1, "value1");
+ return ConditionsUtility.CompareStrings(value0, value1, this.OperatorId);
+ }
+
+ ///
+ /// Gets the operator.
+ ///
+ /// Returns the condition operator.
+ protected StringConditionOperator GetOperator()
+ {
+ return ConditionsUtility.GetStringConditionOperatorById(this.OperatorId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickRenderingsByPlaceholder.cs b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickRenderingsByPlaceholder.cs
new file mode 100644
index 0000000..e72de19
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Choose/PickRenderingsByPlaceholder.cs
@@ -0,0 +1,95 @@
+using Sitecore;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using Sitecore.Rules.Conditions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class PickRenderingsByPlaceholder : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string RenderingId { get; set; }
+
+ public int Skip { get; set; }
+ public int Take { get; set; }
+
+ public string Value { get; set; }
+ public string OperatorId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ var renderings = ruleContext.SelectedDevice.Renderings.Cast().ToList();
+ if (!string.IsNullOrWhiteSpace(RenderingId))
+ {
+ renderings = renderings.Where(x => x.ItemID.Equals(RenderingId, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+
+ var qIds = new List();
+ foreach (var r in renderings)
+ {
+ if (Compare(StringUtil.EnsurePrefix('/', r.Placeholder),Value))
+ {
+ qIds.Add(r.UniqueId);
+ }
+ }
+ renderings = renderings.Where(x => qIds.Contains(x.UniqueId)).ToList();
+
+
+ if (renderings.Any())
+ {
+ if (Take > 0)
+ {
+ foreach(var r in renderings.Skip(Skip).Take(Take) )
+ {
+ if (!ruleContext.SelectedRenderings.Any(x => x.UniqueId.Equals(r.UniqueId)))
+ ruleContext.SelectedRenderings.Add(r);
+ }
+ }
+ else
+ {
+ foreach (var r in renderings)
+ {
+ if (!ruleContext.SelectedRenderings.Any(x => x.UniqueId.Equals(r.UniqueId)))
+ ruleContext.SelectedRenderings.Add(r);
+ }
+ }
+ }
+
+ BotLog.Log.Info($"PICK - Attempted Add... Current Selection({ruleContext.SelectedRenderings.Count}): {string.Join(",",ruleContext.SelectedRenderings.Select(x=>x.UniqueId))}");
+ Log.Info($"DESIGNBOT:: PICK - Attempted Add... Current Selection({ruleContext.SelectedRenderings.Count}): {string.Join(",", ruleContext.SelectedRenderings.Select(x => x.UniqueId))}", this);
+ }
+
+
+
+ ///
+ /// Compares the specified value0.
+ ///
+ /// The value0.
+ /// The value1.
+ /// The boolean.
+ protected bool Compare(string value0, string value1)
+ {
+ Assert.ArgumentNotNull(value0, "value0");
+ Assert.ArgumentNotNull(value1, "value1");
+ return ConditionsUtility.CompareStrings(value0, value1, this.OperatorId);
+ }
+
+ ///
+ /// Gets the operator.
+ ///
+ /// Returns the condition operator.
+ protected StringConditionOperator GetOperator()
+ {
+ return ConditionsUtility.GetStringConditionOperatorById(this.OperatorId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Datasource/ClearDatasourceDescendantsField.cs b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/ClearDatasourceDescendantsField.cs
new file mode 100644
index 0000000..d601f67
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/ClearDatasourceDescendantsField.cs
@@ -0,0 +1,62 @@
+using Community.Foundation.DesignBot.Extensions;
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using System;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Datasource
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class ClearDatasourceDescendantsField : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public ID TemplateId { get; set; }
+ public ID FieldId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(TemplateId, "TemplateId");
+ Assert.ArgumentNotNullOrEmpty(FieldId, "FieldId");
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ var dsItem = rendering.GetDatasourceItem(ruleContext.Item);
+ if (dsItem == null)
+ continue;
+
+ var subItems = dsItem.Axes.GetDescendants().Where(x => x.TemplateID.Equals(TemplateId)).ToList();
+ foreach(var subItem in subItems)
+ {
+ if (!string.IsNullOrEmpty(subItem[FieldId]))
+ {
+ try
+ {
+ var sItem2 = subItem.AsNewVersion(matchWorkflowState:true);
+ sItem2.Editing.BeginEdit();
+ sItem2[FieldId] = null;
+ sItem2.Editing.EndEdit();
+ BotLog.Log.Info($"UPDATED datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId}");
+ Log.Info($"DESIGNBOT:: UPDATED datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId}", this);
+ }
+ catch (Exception ex)
+ {
+ BotLog.Log.Error($"UPDATE FAILED on datasource descendant item {subItem.DisplayName}, {subItem.ID}, attempting to clear field id {FieldId}", ex);
+ Log.Error($"DESIGNBOT:: UPDATE FAILED on datasource descendant item {subItem.DisplayName}, {subItem.ID}, attempting to clear field id {FieldId}", ex, this);
+ throw;
+ }
+ }
+ else
+ {
+ BotLog.Log.Info($"Skipped datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} already empty");
+ Log.Info($"DESIGNBOT:: Skipped datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} already empty", this);
+ }
+ }
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Datasource/ClearDatasourceField.cs b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/ClearDatasourceField.cs
new file mode 100644
index 0000000..e734cd5
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/ClearDatasourceField.cs
@@ -0,0 +1,56 @@
+using Community.Foundation.DesignBot.Extensions;
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using System;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Datasource
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class ClearDatasourceField : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public ID FieldId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(FieldId, "FieldId");
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ var dsItem = rendering.GetDatasourceItem(ruleContext.Item);
+ if (dsItem == null)
+ continue;
+
+ if (!string.IsNullOrEmpty(dsItem[FieldId]))
+ {
+ try
+ {
+ dsItem = dsItem.AsNewVersion(matchWorkflowState: true);
+ dsItem.Editing.BeginEdit();
+ dsItem[FieldId] = null;
+ dsItem.Editing.EndEdit();
+ BotLog.Log.Info($"UPDATED datasource item {dsItem.DisplayName}, {dsItem.ID}, cleared field id {FieldId}");
+ Log.Info($"DESIGNBOT:: UPDATED datasource item {dsItem.DisplayName}, {dsItem.ID}, cleared field id {FieldId}",this);
+ }
+ catch (Exception ex)
+ {
+ BotLog.Log.Error($"UPDATE FAILED on datasource item {dsItem.DisplayName}, {dsItem.ID}, attempting to clear field id {FieldId}", ex);
+ Log.Error($"DESIGNBOT:: UPDATE FAILED on datasource item {dsItem.DisplayName}, {dsItem.ID}, attempting to clear field id {FieldId}", ex, this);
+ throw;
+ }
+ }
+ else
+ {
+ BotLog.Log.Info($"Skipped datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} already empty");
+ Log.Info($"DESIGNBOT:: Skipped datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} already empty", this);
+ }
+
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SetDatasourceDescendantsField.cs b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SetDatasourceDescendantsField.cs
new file mode 100644
index 0000000..c98399c
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SetDatasourceDescendantsField.cs
@@ -0,0 +1,61 @@
+using Community.Foundation.DesignBot.Extensions;
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using System;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Datasource
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class SetDatasourceDescendantsField : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public ID TemplateId { get; set; }
+ public ID FieldId { get; set; }
+ public string Value { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(TemplateId, "TemplateId");
+ Assert.ArgumentNotNullOrEmpty(FieldId, "FieldId");
+ Assert.ArgumentNotNullOrEmpty(Value, "Value");
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ var dsItem = rendering.GetDatasourceItem(ruleContext.Item);
+ if (dsItem == null)
+ continue;
+
+ var subItems = dsItem.Axes.GetDescendants().Where(x => x.TemplateID.Equals(TemplateId)).ToList();
+ foreach(var subItem in subItems)
+ {
+ if(subItem[FieldId] != Value)
+ {
+ try
+ {
+ var sItem2 = subItem.AsNewVersion(matchWorkflowState: true);
+ sItem2.Editing.BeginEdit();
+ sItem2[FieldId] = Value;
+ sItem2.Editing.EndEdit();
+ BotLog.Log.Info($"UPDATED datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} to value '{Value}'");
+ Log.Info($"DESIGNBOT:: UPDATED datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} to value '{Value}'", this);
+ }
+ catch(Exception ex)
+ {
+ BotLog.Log.Error($"UPDATE FAILED on datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} attempting value '{Value}'", ex);
+ Log.Error($"DESIGNBOT:: UPDATE FAILED on datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} attempting value '{Value}'", ex, this);
+ throw;
+ }
+ } else
+ BotLog.Log.Info($"Skipped datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} already matches value '{Value}'");
+ Log.Info($"DESIGNBOT:: Skipped datasource descendant item {subItem.DisplayName}, {subItem.ID}, field id {FieldId} already matches value '{Value}'", this);
+ }
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SetDatasourceField.cs b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SetDatasourceField.cs
new file mode 100644
index 0000000..e92d4a5
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SetDatasourceField.cs
@@ -0,0 +1,55 @@
+using Community.Foundation.DesignBot.Extensions;
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using System;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Datasource
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class SetDatasourceField : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public ID FieldId { get; set; }
+ public string Value { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(FieldId, "FieldId");
+ Assert.ArgumentNotNullOrEmpty(Value, "Value");
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ var dsItem = rendering.GetDatasourceItem(ruleContext.Item);
+ if (dsItem == null)
+ continue;
+
+ if(dsItem[FieldId] != Value)
+ {
+ try
+ {
+ dsItem = dsItem.AsNewVersion(matchWorkflowState: true);
+ dsItem.Editing.BeginEdit();
+ dsItem[FieldId] = Value;
+ dsItem.Editing.EndEdit();
+ BotLog.Log.Info($"UPDATED datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} to value '{Value}'");
+ Log.Info($"DESIGNBOT:: UPDATED datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} to value '{Value}'", this);
+ }
+ catch(Exception ex)
+ {
+ BotLog.Log.Error($"UPDATE FAILED on datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} attempting value '{Value}'", ex);
+ Log.Error($"DESIGNBOT:: UPDATE FAILED on datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} attempting value '{Value}'", ex, this);
+ throw;
+ }
+ } else
+ BotLog.Log.Info($"Skipped datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} already matches value '{Value}'");
+ Log.Info($"DESIGNBOT:: Skipped datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldId} already matches value '{Value}'", this);
+
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SwapDatasourceFields.cs b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SwapDatasourceFields.cs
new file mode 100644
index 0000000..a57ee98
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Datasource/SwapDatasourceFields.cs
@@ -0,0 +1,54 @@
+using Community.Foundation.DesignBot.Extensions;
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using System;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Datasource
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class SwapDatasourceFields : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public ID FieldIdA { get; set; }
+ public ID FieldIdB { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(FieldIdA, "FieldIdA");
+ Assert.ArgumentNotNullOrEmpty(FieldIdB, "FieldIdB");
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ var dsItem = rendering.GetDatasourceItem(ruleContext.Item);
+ if (dsItem == null)
+ continue;
+
+ try
+ {
+ dsItem = dsItem.AsNewVersion(matchWorkflowState: true);
+ dsItem.Editing.BeginEdit();
+ {
+ var swap = dsItem[FieldIdA];
+ dsItem[FieldIdA] = dsItem[FieldIdB];
+ dsItem[FieldIdB] = swap;
+ }
+ dsItem.Editing.EndEdit();
+ BotLog.Log.Info($"UPDATED datasource item {dsItem.DisplayName}, {dsItem.ID}, swapped field id {FieldIdA} value with field id {FieldIdB}");
+ Log.Info($"DESIGNBOT:: UPDATED datasource item {dsItem.DisplayName}, {dsItem.ID}, swapped field id {FieldIdA} value with field id {FieldIdB}", this);
+ }
+ catch(Exception ex)
+ {
+ dsItem.Editing.CancelEdit();
+ BotLog.Log.Error($"UPDATE FAILED on datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldIdA} attempting swap with field id {FieldIdB}", ex);
+ Log.Error($"DESIGNBOT:: UPDATE FAILED on datasource item {dsItem.DisplayName}, {dsItem.ID}, field id {FieldIdA} attempting swap with field id {FieldIdB}", ex, this);
+ throw;
+ }
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Layout/SetLayout.cs b/src/Foundation/DesignBot/code/Rules/Actions/Layout/SetLayout.cs
new file mode 100644
index 0000000..b2eea70
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Layout/SetLayout.cs
@@ -0,0 +1,25 @@
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Choose
+{
+ ///
+ /// Set Layout of selected device
+ ///
+ public class SetLayout : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public ID LayoutId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ BotLog.Log.Info($"LAYOUT - set to {LayoutId}");
+ Log.Info($"DESIGNBOT:: LAYOUT - set to {LayoutId}", this);
+
+ ruleContext.SelectedDevice.Layout = LayoutId.ToString();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Parameters/AppendParameterTermAction.cs b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/AppendParameterTermAction.cs
new file mode 100644
index 0000000..4b7b991
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/AppendParameterTermAction.cs
@@ -0,0 +1,70 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using Sitecore.Text;
+using System.Web;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Parameters
+{
+ ///
+ /// "set multilist [parameter], append [term]"
+ /// Add (if not already exists) one term of a delimited parameter value
+ /// Example: add one ID to a multilist
+ ///
+ ///
+ public class AppendParameterTermAction : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string Name { get; set; } // Name of rendering param
+ public string Term { get; set; } // Term of rendering param value to remove
+ public string Delimiter { get; set; } // Example "|" ... originally tried adding this as input to rule, but, oddly a single pipe as a value breaks the UI
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(Name, "Name");
+ Assert.ArgumentNotNullOrEmpty(Term, "Term");
+ // Assert.ArgumentNotNullOrEmpty(Delimiter, "Delimiter");
+ Delimiter = "|"; // hard code for now
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ // Simple case, no parameters, set our name-value directly (no conflicts)
+ if (string.IsNullOrWhiteSpace(rendering.Parameters))
+ {
+ rendering.Parameters = $"{Name}={Term ?? string.Empty}";
+ ruleContext.HasLayoutChange = true;
+ BotLog.Log.Info($"UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} added term '{Term}'");
+ Log.Info($"DESIGNBOT:: UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} added term '{Term}'", this);
+ continue;
+ }
+
+ var urlString = new UrlString(rendering.Parameters);
+ var rawValue = urlString.Parameters[Name];
+
+ // Missing parameter case, add our name-value to list
+ if (string.IsNullOrWhiteSpace(rawValue))
+ {
+ urlString.Append(Name, Term ?? string.Empty);
+ ruleContext.HasLayoutChange = true;
+ BotLog.Log.Info($"UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} added term '{Term}'");
+ Log.Info($"DESIGNBOT:: UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} added term '{Term}'", this);
+ continue;
+ }
+
+ if (!rawValue.EndsWith(Delimiter))
+ rawValue += Delimiter;
+
+ // Case already exists
+ if (string.Concat(Delimiter, HttpUtility.UrlDecode(rawValue)).Contains(string.Concat(Delimiter, HttpUtility.UrlDecode(Term), Delimiter)))
+ continue;
+
+ rawValue += Term;
+ urlString.Append(Name, rawValue);
+ rendering.Parameters = urlString.GetUrl();
+ ruleContext.HasLayoutChange = true;
+ BotLog.Log.Info($"UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} added term '{Term}'");
+ Log.Info($"DESIGNBOT:: UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} added term '{Term}'", this);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Parameters/ClearFriendlyParameterAction.cs b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/ClearFriendlyParameterAction.cs
new file mode 100644
index 0000000..71b4dde
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/ClearFriendlyParameterAction.cs
@@ -0,0 +1,31 @@
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Parameters
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class ClearFriendlyParameterAction : ClearParameterAction
+ where T : DesignBotRuleContext
+ {
+ public string ParameterId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ // Map Parameter option
+ ID paramID;
+ if (ID.TryParse(ParameterId, out paramID))
+ {
+ Name = Sitecore.Context.Database?.GetItem(paramID)?.Name;
+ }
+
+ if (string.IsNullOrWhiteSpace(Name))
+ return;
+
+ base.Apply(ruleContext);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Parameters/ClearParameterAction.cs b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/ClearParameterAction.cs
new file mode 100644
index 0000000..c814f39
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/ClearParameterAction.cs
@@ -0,0 +1,43 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using Sitecore.Text;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Parameters
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class ClearParameterAction : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string Name { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(Name, "Name");
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ // Simple case, no parameters, nothing to remove
+ if (string.IsNullOrWhiteSpace(rendering.Parameters))
+ {
+ continue;
+ }
+
+ // Parse case
+ var urlString = new UrlString(rendering.Parameters);
+ if (string.IsNullOrEmpty(urlString.Parameters[Name]))
+ {
+ continue; // does not exist, nothing to remove
+ }
+
+ urlString.Remove(Name);
+ rendering.Parameters = urlString.GetUrl();
+ ruleContext.HasLayoutChange = true;
+ BotLog.Log.Info($"UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) cleared parameter {Name}");
+ Log.Info($"DESIGNBOT:: UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) cleared parameter {Name}", this);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Parameters/RemoveParameterTermAction.cs b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/RemoveParameterTermAction.cs
new file mode 100644
index 0000000..a26fa5f
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/RemoveParameterTermAction.cs
@@ -0,0 +1,61 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using Sitecore.Text;
+using System;
+using System.Linq;
+using System.Web;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Parameters
+{
+ ///
+ /// "set multilist [parameter], remove [term] (if exists)"
+ /// Remove (if exists) one term of a delimited parameter value
+ /// Example: remove one ID from a multilist
+ ///
+ public class RemoveParameterTermAction : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string Name { get; set; } // Name of rendering param
+ public string Term { get; set; } // Term of rendering param value to remove
+ public string Delimiter { get; set; } // Example "|" ... ugh this breaks the UI
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(Name, "Name");
+ Assert.ArgumentNotNullOrEmpty(Term, "Term");
+ // Assert.ArgumentNotNullOrEmpty(Delimiter, "Delimiter");
+ Delimiter = "|";
+
+ foreach (var rendering in ruleContext.SelectedRenderings)
+ {
+ // Simple case, no value, nothing to clear
+ if (string.IsNullOrWhiteSpace(rendering.Parameters))
+ {
+ continue;
+ }
+
+ // Missing parameter case, nothing to clear
+ var urlString = new UrlString(rendering.Parameters);
+ var rawValue = urlString.Parameters[Name];
+ if (string.IsNullOrWhiteSpace(rawValue))
+ continue;
+
+ // Missing value case, nothing to clear
+ var valueList = rawValue.Split(new string[] { Delimiter }, StringSplitOptions.RemoveEmptyEntries);
+ if (!valueList.Any(x => x != null && HttpUtility.UrlDecode(x).Equals(HttpUtility.UrlDecode(Term))))
+ continue;
+
+ // Remove term
+ var newList = string.Join(Delimiter,
+ valueList.Where(x => x != null && !HttpUtility.UrlDecode(x).Equals(HttpUtility.UrlDecode(Term), StringComparison.OrdinalIgnoreCase))
+ );
+ urlString.Append(Name, newList ?? string.Empty);
+ rendering.Parameters = urlString.GetUrl();
+ ruleContext.HasLayoutChange = true;
+ BotLog.Log.Info($"UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} removed term '{Term}'");
+ Log.Info($"DESIGNBOT:: UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} removed term '{Term}'", this);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Parameters/SetFriendlyParameterAction.cs b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/SetFriendlyParameterAction.cs
new file mode 100644
index 0000000..e9bf43f
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/SetFriendlyParameterAction.cs
@@ -0,0 +1,31 @@
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Parameters
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class SetFriendlyParameterAction : SetParameterAction
+ where T : DesignBotRuleContext
+ {
+ public string ParameterId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ // Map Parameter option
+ ID paramID;
+ if (ID.TryParse(ParameterId, out paramID))
+ {
+ Name = Sitecore.Context.Database?.GetItem(paramID)?.Name;
+ }
+
+ if (string.IsNullOrWhiteSpace(Name))
+ return;
+
+ base.Apply(ruleContext);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Parameters/SetParameterAction.cs b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/SetParameterAction.cs
new file mode 100644
index 0000000..b69079c
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Parameters/SetParameterAction.cs
@@ -0,0 +1,50 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using Sitecore.Text;
+using System.Web;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Parameters
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class SetParameterAction : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string Name { get; set; }
+ public string Value { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNullOrEmpty(Name, "Name");
+
+ foreach(var rendering in ruleContext.SelectedRenderings)
+ {
+ // Simple case, no existing parameters
+ if (string.IsNullOrWhiteSpace(rendering.Parameters))
+ {
+ rendering.Parameters = $"{Name}={Value ?? string.Empty}}}";
+ ruleContext.HasLayoutChange = true;
+ BotLog.Log.Info($"UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} to value '{Value}'");
+ Log.Info($"DESIGNBOT:: UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} to value '{Value}'", this);
+ continue;
+ }
+
+ // Parse case, set new value keeping other name-value pairs
+
+ // Value matches case, exit
+ var urlString = new UrlString(rendering.Parameters);
+ if (!string.IsNullOrWhiteSpace(urlString[Name])
+ && HttpUtility.UrlDecode(urlString[Name]).Equals(HttpUtility.UrlDecode(Value)))
+ continue;
+
+ urlString.Append(Name,Value ?? string.Empty);
+ rendering.Parameters = urlString.GetUrl();
+ ruleContext.HasLayoutChange = true;
+ BotLog.Log.Info($"UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} to value '{Value}'");
+ Log.Info($"DESIGNBOT:: UPDATED rendering {rendering.ItemID} ({rendering.Placeholder}{rendering.UniqueId}) parameter {Name} to value '{Value}'", this);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingIndexes.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingIndexes.cs
new file mode 100644
index 0000000..5f86a61
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingIndexes.cs
@@ -0,0 +1,90 @@
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Move selected renderings to index of first location of provided rendering ID
+ ///
+ public class MoveRenderingIndexes : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string RenderingId { get; set; }
+ public bool IsBefore { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+ Assert.ArgumentNotNull(RenderingId, "RenderingId");
+
+ if (!ruleContext.SelectedRenderings.Any())
+ return;
+
+ var targetIndex = -1;
+ var isMatch = false;
+ foreach (RenderingDefinition r in ruleContext.SelectedDevice.Renderings)
+ {
+ targetIndex++;
+ if (r.ItemID.Equals(RenderingId, StringComparison.OrdinalIgnoreCase)) {
+ isMatch = true;
+ break;
+ }
+ }
+ if (!isMatch)
+ {
+ BotLog.Log.Info($"MOVE - skipped, no target renderingId {RenderingId}");
+ Log.Info($"DESIGNBOT:: MOVE - skipped, no target renderingId {RenderingId}", this);
+ return;
+ }
+
+ // Handle case of placing after target vs before
+ if (!IsBefore)
+ targetIndex++;
+
+ BotLog.Log.Info($"MOVE - renderings to index {targetIndex} the first occurence of {RenderingId}");
+ Log.Info($"DESIGNBOT:: MOVE - renderings to index {targetIndex} the first occurence of {RenderingId}", this);
+
+ var indexes = new List();
+ var queueFront = new List();
+ var queueBehind = new List();
+ var uids = ruleContext.SelectedRenderings.Select(x => x.UniqueId).ToArray();
+
+ // Build list of indexes from current selection (backwards)
+ for (var i = ruleContext.SelectedDevice.Renderings.Count - 1; i >= 0 ; i--)
+ {
+ var r = ruleContext.SelectedDevice.Renderings[i] as RenderingDefinition;
+ if (uids.Contains(r.UniqueId))
+ {
+ indexes.Add(i);
+ // Isolate renderings that when removed will affect the target position index number
+ if (i < targetIndex)
+ queueFront.Add(r);
+ else
+ queueBehind.Add(r);
+ }
+ }
+
+ // Remove (backwards - so index is descending to keep indexes accurate while deleting)
+ foreach (var index in indexes)
+ {
+ ruleContext.SelectedDevice.Renderings.RemoveAt(index);
+ ruleContext.HasLayoutChange = true;
+ }
+
+ targetIndex = Math.Max(0,targetIndex - queueFront.Count());
+ // Add to target (backwards so items maintain same order)
+ foreach (var p in queueBehind)
+ {
+ ruleContext.SelectedDevice.Insert(targetIndex, p);
+ }
+ foreach (var p in queueFront)
+ {
+ ruleContext.SelectedDevice.Insert(targetIndex, p);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingIndexesBefore.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingIndexesBefore.cs
new file mode 100644
index 0000000..c74376e
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingIndexesBefore.cs
@@ -0,0 +1,13 @@
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Move selected renderings to index of first location of provided rendering ID
+ ///
+ public class MoveRenderingIndexesBefore : MoveRenderingIndexes
+ where T : DesignBotRuleContext
+ {
+ public MoveRenderingIndexesBefore(){
+ IsBefore = true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingsToFront.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingsToFront.cs
new file mode 100644
index 0000000..6e6cd7a
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveRenderingsToFront.cs
@@ -0,0 +1,54 @@
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Move selected renderings to front of all listed renderings
+ ///
+ public class MoveRenderingsToFront : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ if (!ruleContext.SelectedRenderings.Any())
+ return;
+
+ BotLog.Log.Info($"MOVE - renderings to front");
+ Log.Info($"DESIGNBOT:: MOVE - renderings to front", this);
+
+ var indexes = new List();
+ var queue = new List();
+ var uids = ruleContext.SelectedRenderings.Select(x => x.UniqueId).ToArray();
+
+ // Build list of indexes from current selection (backwards)
+ for (var i = ruleContext.SelectedDevice.Renderings.Count - 1; i >= 0 ; i--)
+ {
+ var r = ruleContext.SelectedDevice.Renderings[i] as RenderingDefinition;
+ if (uids.Contains(r.UniqueId))
+ {
+ indexes.Add(i);
+ queue.Add(r);
+ }
+ }
+
+ // Remove (backwards - so index is descending to keep indexes accurate while deleting)
+ foreach (var index in indexes)
+ {
+ ruleContext.SelectedDevice.Renderings.RemoveAt(index);
+ }
+
+ // Add to front (backwards so items maintain same order)
+ foreach (var p in queue)
+ {
+ ruleContext.SelectedDevice.Insert(0, p);
+ ruleContext.HasLayoutChange = true;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveToPlaceholder.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveToPlaceholder.cs
new file mode 100644
index 0000000..c1b87ca
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/MoveToPlaceholder.cs
@@ -0,0 +1,108 @@
+using Sitecore;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Moves selected renderings within "FromPath" to live within "ToPath" honoring nested sub-structure.
+ /// Uses selected device (defaults to default device, but can be overriden with a previous SetDevice action)
+ /// NOTE: Sets ruleContext.HasLayoutChange to TRUE if change was made to any renderings
+ ///
+ ///
+ public class MoveToPlaceholder : RuleAction where T : DesignBotRuleContext
+ {
+ public string FromPath { get; set; }
+ public string ToPath { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, nameof(ruleContext));
+
+ if (string.IsNullOrWhiteSpace(FromPath) || string.IsNullOrWhiteSpace(ToPath))
+ return;
+ if (FromPath.Equals(ToPath))
+ return;
+
+ // normalize input, no trailing slash
+ FromPath = StringUtil.EnsurePrefix('/',FromPath.TrimEnd('/'));
+ ToPath = StringUtil.EnsurePrefix('/', ToPath.TrimEnd('/'));
+
+ // Use all renderings of selected device
+ var renderings = ruleContext.SelectedRenderings;
+
+ // Handle Special case (target lives inside broader source)
+ // Solution: flatten in-between problem paths to be FromPath
+ if (ToPath.TrimStart('/').StartsWith(FromPath.TrimStart('/')))
+ {
+ var segments = ToPath.Split(new[] { '/' }, System.StringSplitOptions.RemoveEmptyEntries);
+ // For each problem path, backwards, between FROM and TO.. (ie given /A/B/C/D => /A/B/C, /A/B)
+ for (var s = segments.Length - 1; s > 1; s--) // 3 .. 2 => 3, 2
+ {
+ string problemPath = string.Empty;
+ for (var i = 0; i < s; i++) // 0, 1, 2; 0, 1;
+ {
+ problemPath = string.Concat(problemPath, "/", segments[i]);
+ }
+ // Set to FROM path
+ foreach (var r in renderings)
+ {
+ if (r.Placeholder.Equals(problemPath))
+ r.Placeholder = FromPath;
+ }
+ }
+ }
+
+ // Move to new placeholder (maintaining nested structure)
+ foreach (var r in renderings)
+ {
+ if(TryReplacePath(r, FromPath, ToPath))
+ ruleContext.HasLayoutChange = true;
+ }
+
+ }
+
+ ///
+ /// Moves rendering to new placeholder path honoring nested structure
+ ///
+ ///
+ /// segment(s) to disgard
+ /// segment(s) to use as new root path (in place of from path)
+ /// True if change occurred else false
+ protected bool TryReplacePath(RenderingDefinition r, string from, string to)
+ {
+ // Ignore renderings not within "from" path
+ // Compare carefully as "main" or first placeholder often does not have the initial '/'
+ if (!r.Placeholder.TrimStart('/').StartsWith(from.TrimStart('/')))
+ return false;
+
+ // Ignore renderings already within "to" path
+ // Compare carefully as "main" or first placeholder often does not have the initial '/'
+ if (r.Placeholder.TrimStart('/').StartsWith(to.TrimStart('/')))
+ return false;
+
+ if (
+ r.Placeholder.Equals(from) // simple case
+ || r.Placeholder.Equals(from.TrimStart('/')) // single segment case
+ )
+ {
+ r.Placeholder = to;
+ BotLog.Log.Info($"MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{to}'");
+ Log.Info($"DESIGNBOT:: MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{to}'", this);
+ return true;
+ }
+ else if (r.Placeholder.StartsWith(from + "/")) // nested case
+ {
+ var target = r.Placeholder.Replace(from + "/", to + "/");
+ BotLog.Log.Info($"MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{target}'");
+ Log.Info($"DESIGNBOT:: MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{target}'", this);
+ r.Placeholder = target;
+ return true;
+ }
+
+ return false;
+ }
+ }
+}
+
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/RemoveSegment.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/RemoveSegment.cs
new file mode 100644
index 0000000..57b145f
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/RemoveSegment.cs
@@ -0,0 +1,72 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+using Sitecore.Rules.Conditions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Add or update one specific parameter, maintain the rest of the parameters as is
+ ///
+ public class RemoveSegment : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string Value { get; set; }
+ public string OperatorId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ BotLog.Log.Info($"PLACEHOLDER - removing segment compared to '{Value}'");
+ Log.Info($"DESIGNBOT:: PLACEHOLDER - removing segment compared to '{Value}'", this);
+
+ // Use selected renderings only
+ var renderings = ruleContext.SelectedRenderings;
+
+ foreach (var r in renderings)
+ {
+ var segments = r.Placeholder.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
+ var keep = new List();
+ foreach(var segment in segments)
+ {
+ if (!Compare(segment, Value)) {
+ keep.Add(segment);
+ }
+ }
+ var newPath = keep.Count > 1 ? string.Concat("/", string.Join("/", keep)) : keep.FirstOrDefault();
+
+ if (r.Placeholder != newPath)
+ {
+ r.Placeholder = newPath;
+ ruleContext.HasLayoutChange = true;
+ }
+ }
+ }
+
+
+ ///
+ /// Compares the specified value0.
+ ///
+ /// The value0.
+ /// The value1.
+ /// The boolean.
+ protected bool Compare(string value0, string value1)
+ {
+ Assert.ArgumentNotNull(value0, "value0");
+ Assert.ArgumentNotNull(value1, "value1");
+ return ConditionsUtility.CompareStrings(value0, value1, this.OperatorId);
+ }
+
+ ///
+ /// Gets the operator.
+ ///
+ /// Returns the condition operator.
+ protected StringConditionOperator GetOperator()
+ {
+ return ConditionsUtility.GetStringConditionOperatorById(this.OperatorId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SetPlaceholder.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SetPlaceholder.cs
new file mode 100644
index 0000000..26c1da6
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SetPlaceholder.cs
@@ -0,0 +1,34 @@
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Actions;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Set placeholder path of selected renderings
+ ///
+ public class SetPlaceholders : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string Path { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ BotLog.Log.Info($"PLACEHOLDER - set all selected to {Path}");
+ Log.Info($"DESIGNBOT:: PLACEHOLDER - set all selected to {Path}", this);
+
+ // Use selected renderings only
+ var renderings = ruleContext.SelectedRenderings;
+
+ foreach (var r in renderings)
+ {
+ if (!r.Placeholder.Equals(Path))
+ {
+ r.Placeholder = Path;
+ ruleContext.HasLayoutChange = true;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SortRenderings.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SortRenderings.cs
new file mode 100644
index 0000000..c91ba2e
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SortRenderings.cs
@@ -0,0 +1,48 @@
+using Community.Foundation.DesignBot.Comparer;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using System.Text;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Order all rendering by placeholder path
+ ///
+ public class SortRenderings : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ BotLog.Log.Info($"SORTING - all renderings by placeholder paths");
+ Log.Info($"DESIGNBOT:: SORTING - all renderings by placeholder paths", this);
+
+ var stamp1 = GenerateStamp(ruleContext.SelectedDevice);
+
+ var comparer = new RenderingComparer();
+ ruleContext.SelectedDevice.Renderings.Sort(comparer);
+
+ var stamp2 = GenerateStamp(ruleContext.SelectedDevice);
+ if(stamp1 != stamp2)
+ {
+ ruleContext.HasLayoutChange = true;
+ }
+ }
+
+ ///
+ /// Purpose: Make a string that will change if the sort order of the renderings change
+ /// Implementation: sequential string of renderings' unique ID
+ ///
+ ///
+ ///
+ public string GenerateStamp(DeviceDefinition defn) {
+ var hash = new StringBuilder();
+ foreach (RenderingDefinition rendering in defn.Renderings) {
+ hash.Append(rendering.UniqueId);
+ }
+ return hash.ToString();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SwapPlaceholderContent.cs b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SwapPlaceholderContent.cs
new file mode 100644
index 0000000..7a23f91
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Placeholders/SwapPlaceholderContent.cs
@@ -0,0 +1,92 @@
+using Sitecore;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Placeholders
+{
+ ///
+ /// Swaps placeholder path strings, effectively swapping components in placeholder A and placeholder B.
+ /// Uses selected device (defaults to default device, but can be overriden with a previous SetDevice action)
+ /// NOTE: Sets ruleContext.HasLayoutChange to TRUE if change was made to any renderings
+ ///
+ ///
+ public class SwapPlaceholderContent : RuleAction where T : DesignBotRuleContext
+ {
+ public string PathA { get; set; }
+ public string PathB { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, nameof(ruleContext));
+
+ if (string.IsNullOrWhiteSpace(PathA) || string.IsNullOrWhiteSpace(PathB))
+ return;
+
+ // normalize input, ensure initial slash, avoid trailing slash
+ PathA = StringUtil.EnsurePrefix('/', PathA.TrimEnd('/'));
+ PathB = StringUtil.EnsurePrefix('/', PathB.TrimEnd('/'));
+
+ // Ensure Path A is the longer path (most specific in case of matching nested placeholder paths)
+ if (PathB.Length > PathA.Length) {
+ var x = PathA;
+ PathA = PathB;
+ PathB = x;
+ }
+
+ // Use all renderings of selected device
+ var renderings = ruleContext.SelectedRenderings;
+
+ // Set PathA to temporary PathX
+ var pathX = "XXXSWAPXXX";
+ foreach(var r in renderings)
+ {
+ if (
+ TrySwapPath(r, PathA, pathX)
+ )
+ ruleContext.HasLayoutChange = true;
+ }
+
+ // Set PathB to PathA, PathX to PathB
+ foreach (var r in renderings)
+ {
+ if (
+ TrySwapPath(r, PathB, PathA)
+ )
+ ruleContext.HasLayoutChange = true;
+ else
+ TrySwapPath(r, pathX, PathB);
+ }
+
+ }
+
+ ///
+ /// Swaps partial placeholder path x to use partial path y (where applicable) on rendering r
+ ///
+ ///
+ ///
+ ///
+ /// True if change occurred else false
+ protected bool TrySwapPath(RenderingDefinition r, string x, string y)
+ {
+ if (r.Placeholder.Equals(x))
+ {
+ BotLog.Log.Info($"MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{y}'");
+ Log.Info($"DESIGNBOT:: MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{y}'", this);
+ r.Placeholder = y;
+ return true;
+ }
+ else if (r.Placeholder.StartsWith(x + "/"))
+ {
+ var target = r.Placeholder.Replace(x + "/", y + "/");
+ BotLog.Log.Info($"MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{target}'");
+ Log.Info($"DESIGNBOT:: MOVED rendering {r.ItemID} ({r.Placeholder}{r.UniqueId}) from {r.Placeholder} to '{target}'", this);
+ r.Placeholder = target;
+ return true;
+ }
+
+ return false;
+ }
+ }
+}
+
diff --git a/src/Foundation/DesignBot/code/Rules/Actions/Remove/DeleteRendering.cs b/src/Foundation/DesignBot/code/Rules/Actions/Remove/DeleteRendering.cs
new file mode 100644
index 0000000..f69d30f
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Actions/Remove/DeleteRendering.cs
@@ -0,0 +1,66 @@
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Actions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Actions.Remove
+{
+ ///
+ /// Move selected renderings to index of first location of provided rendering ID
+ ///
+ public class DeleteRendering : RuleAction
+ where T : DesignBotRuleContext
+ {
+ public string RenderingId { get; set; }
+
+ public override void Apply(T ruleContext)
+ {
+ Assert.ArgumentNotNull(ruleContext, "ruleContext");
+
+ if (!ruleContext.SelectedRenderings.Any())
+ {
+ BotLog.Log.Info($"DELETE - skipped, no selected renderings");
+ Log.Info($"DESIGNBOT:: DELETE - skipped, no selected renderings", this);
+ return;
+ }
+
+ // Assume remove all selected
+ var uids = ruleContext.SelectedRenderings.Select(x => x.UniqueId).ToArray();
+
+ // Case to filter by type
+ if(!string.IsNullOrWhiteSpace(RenderingId))
+ {
+ uids = ruleContext.SelectedRenderings.Where(x => x.ItemID.Equals(RenderingId, StringComparison.OrdinalIgnoreCase)).Select(x => x.UniqueId).ToArray();
+ if (!uids.Any())
+ {
+ BotLog.Log.Info($"DELETE - skipped, no target renderingId {RenderingId}");
+ Log.Info($"DESIGNBOT:: DELETE - skipped, no target renderingId {RenderingId}", this);
+ return;
+ }
+ }
+
+ // Build list of indexes from current selection (backwards)
+ var indexes = new List();
+ for (var i = ruleContext.SelectedDevice.Renderings.Count - 1; i >= 0 ; i--)
+ {
+ var r = ruleContext.SelectedDevice.Renderings[i] as RenderingDefinition;
+ if (uids.Contains(r.UniqueId))
+ {
+ indexes.Add(i);
+ }
+ }
+
+ // Remove (backwards - so index is descending to keep indexes accurate while deleting)
+ foreach (var index in indexes)
+ {
+ ruleContext.SelectedDevice.Renderings.RemoveAt(index);
+ ruleContext.HasLayoutChange = true;
+ }
+
+ BotLog.Log.Info($"DELETE - removed all selected occurences of {RenderingId}");
+ Log.Info($"DESIGNBOT:: DELETE - removed all selected occurences of {RenderingId}", this);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Conditions/HasDatasourceWithFieldValue.cs b/src/Foundation/DesignBot/code/Rules/Conditions/HasDatasourceWithFieldValue.cs
new file mode 100644
index 0000000..45c3313
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Conditions/HasDatasourceWithFieldValue.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Linq;
+using System.Web;
+using Sitecore;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Conditions;
+using Sitecore.Text;
+using Sitecore.Web;
+
+namespace Community.Foundation.DesignBot.Rules.Conditions
+{
+ public class HasDatasourceWithFieldValue : StringOperatorCondition where T : DesignBotRuleContext
+ {
+ public string Value { get; set; }
+ public string Field { get; set; }
+ public string PlaceholderPath { get; set; }
+ public string RenderingId { get; set; }
+
+ protected override bool Execute(T ruleContext)
+ {
+ Assert.ArgumentNotNull((object) ruleContext, "ruleContext");
+
+ var renderings = ruleContext.SelectedDevice.Renderings.Cast().ToList();
+ if (!string.IsNullOrWhiteSpace(PlaceholderPath))
+ {
+ renderings = renderings.Where(x => x.Placeholder.Equals(PlaceholderPath, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+ if (!string.IsNullOrWhiteSpace(RenderingId))
+ {
+ renderings = renderings.Where(x => x.ItemID.Equals(RenderingId, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+
+ // ...
+
+ return false;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Conditions/HasLayout.cs b/src/Foundation/DesignBot/code/Rules/Conditions/HasLayout.cs
new file mode 100644
index 0000000..112c737
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Conditions/HasLayout.cs
@@ -0,0 +1,20 @@
+using Sitecore.Data;
+using Sitecore.Diagnostics;
+using Sitecore.Rules.Conditions;
+using System;
+
+namespace Community.Foundation.DesignBot.Rules.Conditions
+{
+ public class HasLayout : WhenCondition where T : DesignBotRuleContext
+ {
+ public ID LayoutId { get; set; }
+
+ protected override bool Execute(T ruleContext)
+ {
+ Assert.ArgumentNotNull((object) ruleContext, "ruleContext");
+
+ return ruleContext.SelectedDevice.Layout.Equals(LayoutId.ToString(), StringComparison.OrdinalIgnoreCase);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Conditions/HasRenderingWithParamValue.cs b/src/Foundation/DesignBot/code/Rules/Conditions/HasRenderingWithParamValue.cs
new file mode 100644
index 0000000..43f828d
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Conditions/HasRenderingWithParamValue.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Linq;
+using System.Web;
+using Sitecore;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Conditions;
+using Sitecore.Text;
+using Sitecore.Web;
+
+namespace Community.Foundation.DesignBot.Rules.Conditions
+{
+ public class HasRenderingWithParamValue : StringOperatorCondition where T : DesignBotRuleContext
+ {
+ public string Value { get; set; }
+ public string Param { get; set; }
+ public string PlaceholderPath { get; set; }
+ public string RenderingId { get; set; }
+
+ protected override bool Execute(T ruleContext)
+ {
+ Assert.ArgumentNotNull((object) ruleContext, "ruleContext");
+
+ var renderings = ruleContext.SelectedDevice.Renderings.Cast().ToList();
+ if (!string.IsNullOrWhiteSpace(PlaceholderPath))
+ {
+ renderings = renderings.Where(x => x.Placeholder.Equals(PlaceholderPath, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+ if (!string.IsNullOrWhiteSpace(RenderingId))
+ {
+ renderings = renderings.Where(x => x.ItemID.Equals(RenderingId, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+
+ // Simple case, not checking parameter
+ if (string.IsNullOrWhiteSpace(Param)) {
+ return renderings.Any();
+ }
+
+ // Param value case
+ foreach (var rendering in renderings) {
+
+ var urlString = new UrlString(rendering.Parameters);
+ var rawValue = urlString.Parameters[Param];
+ if (!string.IsNullOrWhiteSpace(rawValue))
+ rawValue = HttpUtility.UrlDecode(rawValue);
+
+ if (Compare(rawValue, Value))
+ return true;
+ }
+
+ return false;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/Conditions/HasRenderingWithPlaceholder.cs b/src/Foundation/DesignBot/code/Rules/Conditions/HasRenderingWithPlaceholder.cs
new file mode 100644
index 0000000..ebe688b
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/Conditions/HasRenderingWithPlaceholder.cs
@@ -0,0 +1,42 @@
+using Sitecore;
+using Sitecore.Diagnostics;
+using Sitecore.Layouts;
+using Sitecore.Rules.Conditions;
+using System;
+using System.Linq;
+
+namespace Community.Foundation.DesignBot.Rules.Conditions
+{
+ public class HasRenderingWithPlaceholder : StringOperatorCondition where T : DesignBotRuleContext
+ {
+ public string Value { get; set; }
+ public string RenderingId { get; set; }
+
+ protected override bool Execute(T ruleContext)
+ {
+ Assert.ArgumentNotNull((object) ruleContext, "ruleContext");
+
+ var renderings = ruleContext.SelectedDevice.Renderings.Cast().ToList();
+ if (!string.IsNullOrWhiteSpace(RenderingId))
+ {
+ renderings = renderings.Where(x => x.ItemID.Equals(RenderingId, StringComparison.OrdinalIgnoreCase)).ToList();
+ }
+
+ // Simple case, nothing left to check
+ if (!renderings.Any()) {
+ return false;
+ }
+
+ foreach (var r in renderings)
+ {
+ if (Compare(StringUtil.EnsurePrefix('/', r.Placeholder), Value))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Rules/DesignBotRuleContext.cs b/src/Foundation/DesignBot/code/Rules/DesignBotRuleContext.cs
new file mode 100644
index 0000000..6705e05
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Rules/DesignBotRuleContext.cs
@@ -0,0 +1,47 @@
+using System.Collections.Generic;
+using System.Linq;
+using Sitecore;
+using Sitecore.Data;
+using Sitecore.Data.Fields;
+using Sitecore.Data.Items;
+using Sitecore.Layouts;
+using Sitecore.Rules;
+
+namespace Community.Foundation.DesignBot.Rules
+{
+ public class DesignBotRuleContext : RuleContext
+ {
+ public DesignBotRuleContext(Item item) {
+ Item = item;
+
+ var sharedLayoutField = item.Fields[FieldIDs.LayoutField];
+ var finalLayoutField = item.Fields[FieldIDs.FinalLayoutField];
+
+ SharedLayout = LayoutDefinition.Parse(LayoutField.GetFieldValue(sharedLayoutField));
+ FinalLayout = LayoutDefinition.Parse(LayoutField.GetFieldValue(finalLayoutField));
+
+ // These can be filled with rule actions
+ // SelectedDatasources = new List- ();
+
+ // This can be overrided with the rule action SetDevice
+ SelectedDevice = FinalLayout.GetDevice(Constants.Items.Device.DefaultId);
+ SelectedRenderings = new List(); // SelectedDevice.Renderings.Cast().ToList();
+ }
+ // public List
- AllowedRenderingItems { get; set; }
+ // public ID DeviceId { get; set; }
+ // public string PlaceholderKey { get; set; }
+ // public Database ContentDatabase { get; set; }
+ // public string LayoutDefinition { get; set; }
+
+ // Outputs
+ public bool HasLayoutChange { get; set; }
+ public LayoutDefinition SharedLayout { get; set; }
+ public LayoutDefinition FinalLayout { get; set; }
+
+ // Internal
+ // public List
- SelectedDatasources { get; set; }
+ public List SelectedRenderings { get; set; }
+ public DeviceDefinition SelectedDevice { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Services/DesignBotService.cs b/src/Foundation/DesignBot/code/Services/DesignBotService.cs
new file mode 100644
index 0000000..33468bf
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Services/DesignBotService.cs
@@ -0,0 +1,98 @@
+using Community.Foundation.DesignBot.Extensions;
+using Community.Foundation.DesignBot.Rules;
+using Sitecore;
+using Sitecore.ContentTesting.Configuration;
+using Sitecore.Data;
+using Sitecore.Data.Fields;
+using Sitecore.Data.Items;
+using Sitecore.Diagnostics;
+using Sitecore.Rules;
+using Sitecore.SecurityModel;
+using System;
+
+namespace Community.Foundation.DesignBot.Services
+{
+ public interface IDesignBotService {
+ string ApplyDesign(Item ruleProgram, Item page);
+ }
+
+
+ public class DesignBotService
+ {
+ private readonly ID SxaDataTemplateId = new ID("{1C82E550-EBCD-4E5D-8ABD-D50D0809541E}");
+
+ public string ApplyDesign(Item ruleProgram, Item page, string crawlDepth = null) {
+ BotLog.Log.Info($"::START:: program {ruleProgram?.DisplayName} on page {page.DisplayName}, {page.ID}, crawl depth {crawlDepth}");
+ Log.Info($"DESIGNBOT::START:: program {ruleProgram?.DisplayName} on page {page.DisplayName}, {page.ID}, crawl depth {crawlDepth}", this);
+
+ // Get design rules
+ RuleList rules = RuleFactory.GetRules(ruleProgram, "Rule");
+ if (rules != null)
+ {
+ // Apply design program
+ int depth;
+ if (!int.TryParse(crawlDepth ?? "0", out depth))
+ depth = 0;
+ depth = Math.Max(0, depth);
+
+ using (new SecurityDisabler())
+ {
+ using (new ScreenshotGenerationDisabler())
+ {
+ RunProgram_r(rules, page, depth);
+ }
+ }
+ }
+
+ BotLog.Log.Info($"::END:: program {ruleProgram?.DisplayName} on page {page.DisplayName}, {page.ID}, crawl depth {crawlDepth}");
+ Log.Info($"DESIGNBOT::END:: program {ruleProgram?.DisplayName} on page {page.DisplayName}, {page.ID}, crawl depth {crawlDepth}", this);
+ return "Success";
+ // item.Editing.BeginEdit();
+ // item.Editing.EndEdit(updateStatistics: true, silent: false);
+ // item.Editing.CancelEdit();
+ }
+
+ public void RunProgram_r(RuleList rules, Item page, int depth)
+ {
+ if (depth < 0 || page == null)
+ return;
+
+ // skip datasource items
+ if (page.TemplateID.Equals(SxaDataTemplateId))
+ return;
+
+ BotLog.Log.Info($"Processing item {page.DisplayName}, {page.ID}...");
+ Log.Info($"DESIGNBOT:: Processing item {page.DisplayName}, {page.ID}...", this);
+
+ try
+ {
+ var ruleContext = new DesignBotRuleContext(page);
+
+ // Run conditions and actions
+ rules.Run(ruleContext);
+
+ if (ruleContext.HasLayoutChange)
+ {
+ // Create new version for easy undo (delete version)
+ page = page.AsNewVersion(matchWorkflowState: true);
+ ItemUtil.SetLayoutDetails(page, ruleContext.SharedLayout.ToXml(), ruleContext.FinalLayout.ToXml());
+ }
+ }
+ catch (Exception ex)
+ {
+ BotLog.Log.Error($"Error applying program to item {page?.ID}", ex);
+ Log.Error($"DESIGNBOT:: Error applying program to item {page?.ID}", ex, this);
+ }
+
+ // Recursion
+ depth--;
+ if (depth < 0 || !page.HasChildren)
+ return;
+ var children = page.GetChildren();
+ foreach (Item child in children) {
+ RunProgram_r(rules, child, depth);
+ }
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Web.Debug.config b/src/Foundation/DesignBot/code/Web.Debug.config
new file mode 100644
index 0000000..fae9cfe
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Web.Debug.config
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Web.Release.config b/src/Foundation/DesignBot/code/Web.Release.config
new file mode 100644
index 0000000..da6e960
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Web.Release.config
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/code/Web.config b/src/Foundation/DesignBot/code/Web.config
new file mode 100644
index 0000000..ff79484
--- /dev/null
+++ b/src/Foundation/DesignBot/code/Web.config
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Foundation/DesignBot/code/packages.config b/src/Foundation/DesignBot/code/packages.config
new file mode 100644
index 0000000..34da431
--- /dev/null
+++ b/src/Foundation/DesignBot/code/packages.config
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot.yml
new file mode 100644
index 0000000..a9c8ea6
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot.yml
@@ -0,0 +1,26 @@
+---
+ID: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Parent: "e7cbefe8-9112-4b95-a978-4e470d94c54a"
+Template: "54dae7cd-bfd8-4e69-9679-75f2ae9f9034"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot
+DB: master
+BranchID: "9a72c539-dbf8-4dad-96d3-a298fc04add6"
+SharedFields:
+- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
+ Hint: __Icon
+ Value: office/32x32/robot.png
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value: "{8D1DB71C-9ACF-4192-8384-5F9B6D533F95}"
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T220325Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Clear Descendants Field.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Clear Descendants Field.yml
new file mode 100644
index 0000000..49019c1
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Clear Descendants Field.yml
@@ -0,0 +1,82 @@
+---
+ID: "1f2f1418-be5f-44c3-8568-b0842f43cca7"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Clear Descendants Field"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Datasource.ClearDatasourceDescendantsField,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Datasource - descendants of [TemplateId,Tree,root=/sitecore/Templates,specific] template, clear [FieldId,Tree,root=/sitecore/Templates,specific] field"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Clear Field.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Clear Field.yml
new file mode 100644
index 0000000..a946cb6
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Clear Field.yml
@@ -0,0 +1,82 @@
+---
+ID: "100ef220-fd5a-4b44-80cd-2102cae5de3b"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Clear Field"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Datasource.ClearDatasourceField,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Datasource - clear [FieldId,Tree,root=/sitecore/Templates,specific] field"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Set Descendants Field.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Set Descendants Field.yml
new file mode 100644
index 0000000..df9627d
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Set Descendants Field.yml
@@ -0,0 +1,82 @@
+---
+ID: "21d10ac5-387b-44e2-8751-45421e505cdf"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Set Descendants Field"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Datasource.SetDatasourceDescendantsField,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Datasource - descendants of [TemplateId,Tree,root=/sitecore/Templates,specific] template, set [FieldId,Tree,root=/sitecore/Templates,specific] field to [Value,,,value]"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Set Field.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Set Field.yml
new file mode 100644
index 0000000..f653c1e
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Set Field.yml
@@ -0,0 +1,82 @@
+---
+ID: "a187d372-48a9-43a6-8320-952bac707829"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Set Field"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Datasource.SetDatasourceField,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Datasource - set [FieldId,Tree,root=/sitecore/Templates,specific] field to [Value,,,value]"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Swap Field Values.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Swap Field Values.yml
new file mode 100644
index 0000000..c65340c
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Datasource - Swap Field Values.yml
@@ -0,0 +1,82 @@
+---
+ID: "a73d754f-7881-48c9-96c9-ce0656b4e85b"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Datasource - Swap Field Values"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Datasource.SwapDatasourceFields,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Datasource - swap values of field [FieldIdA,Tree,root=/sitecore/Templates,A] and [FieldIdB,Tree,root=/sitecore/Templates,B]"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Placeholder match.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Placeholder match.yml
new file mode 100644
index 0000000..e9507a8
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Placeholder match.yml
@@ -0,0 +1,28 @@
+---
+ID: "37411546-0e80-461e-906c-99b68954c044"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f0d16eee-3a05-4e43-a082-795a32b873c0"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Placeholder match
+DB: master
+SharedFields:
+- ID: "ab51c8b2-f0e1-4471-9aae-cc080d774923"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Conditions.HasRenderingWithPlaceholder, Community.Foundation.DesignBot
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T223106Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "af321234-4eb9-4ef5-9197-65903351939c"
+ Hint: Text
+ Value: "page has placeholder path [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Placeholder.yml
new file mode 100644
index 0000000..311016b
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "fe2be19f-00ad-477b-bde8-1bd11a93e49b"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f0d16eee-3a05-4e43-a082-795a32b873c0"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Placeholder
+DB: master
+SharedFields:
+- ID: "ab51c8b2-f0e1-4471-9aae-cc080d774923"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Conditions.HasRenderingWithParamValue, Community.Foundation.DesignBot
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T223106Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "af321234-4eb9-4ef5-9197-65903351939c"
+ Hint: Text
+ Value: "page has [PlaceholderPath,,,specific] placeholder path"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering in Placeholder with Param.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering in Placeholder with Param.yml
new file mode 100644
index 0000000..d90f99d
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering in Placeholder with Param.yml
@@ -0,0 +1,28 @@
+---
+ID: "e7788fb8-d0ee-4706-9a76-fe758f2593b3"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f0d16eee-3a05-4e43-a082-795a32b873c0"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering in Placeholder with Param
+DB: master
+SharedFields:
+- ID: "ab51c8b2-f0e1-4471-9aae-cc080d774923"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Conditions.HasRenderingWithParamValue, Community.Foundation.DesignBot
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T223106Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "af321234-4eb9-4ef5-9197-65903351939c"
+ Hint: Text
+ Value: "page has [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path with [Param,,,specific] parameter [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering in Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering in Placeholder.yml
new file mode 100644
index 0000000..e20997b
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering in Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "acf62966-1540-4796-87aa-d9e241f36111"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f0d16eee-3a05-4e43-a082-795a32b873c0"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering in Placeholder
+DB: master
+SharedFields:
+- ID: "ab51c8b2-f0e1-4471-9aae-cc080d774923"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Conditions.HasRenderingWithParamValue, Community.Foundation.DesignBot
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T223106Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "af321234-4eb9-4ef5-9197-65903351939c"
+ Hint: Text
+ Value: "page has [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering with Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering with Placeholder.yml
new file mode 100644
index 0000000..e37c0b6
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering with Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "62e3acae-744d-4e25-9e5f-58772741219e"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f0d16eee-3a05-4e43-a082-795a32b873c0"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering with Placeholder
+DB: master
+SharedFields:
+- ID: "ab51c8b2-f0e1-4471-9aae-cc080d774923"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Conditions.HasRenderingWithPlaceholder, Community.Foundation.DesignBot
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T223106Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "af321234-4eb9-4ef5-9197-65903351939c"
+ Hint: Text
+ Value: "page has [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering with placeholder path [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering.yml
new file mode 100644
index 0000000..d279dfc
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Has Rendering.yml
@@ -0,0 +1,28 @@
+---
+ID: "4689b214-864a-42d3-b54e-99bb0feefe54"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f0d16eee-3a05-4e43-a082-795a32b873c0"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Has Rendering
+DB: master
+SharedFields:
+- ID: "ab51c8b2-f0e1-4471-9aae-cc080d774923"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Conditions.HasRenderingWithParamValue, Community.Foundation.DesignBot
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T223106Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "af321234-4eb9-4ef5-9197-65903351939c"
+ Hint: Text
+ Value: "page has [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Append Term.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Append Term.yml
new file mode 100644
index 0000000..a914fee
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Append Term.yml
@@ -0,0 +1,86 @@
+---
+ID: "cc76d5fa-8e31-4783-b7f5-50fc4eaff891"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Append Term"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Parameters.AppendParameterTermAction,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Fields:
+ - ID: "9541e67d-ce8c-4225-803d-33f7f29f09ef"
+ Hint: __Short description
+ Value: Add partial value
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter - set [Name,,,specific] multilist parameter, append [Term,,,term]"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Clear.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Clear.yml
new file mode 100644
index 0000000..e8dda40
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Clear.yml
@@ -0,0 +1,82 @@
+---
+ID: "9945789e-2bac-4e02-8a61-ccca46177599"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Clear"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Parameters.ClearParameterAction,Community.Foundation.DesignBot.Rules
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter - clear [Name,,,specific] parameter"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Remove Term.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Remove Term.yml
new file mode 100644
index 0000000..8ac3c29
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Remove Term.yml
@@ -0,0 +1,86 @@
+---
+ID: "cf689289-9e4b-4c59-bbd9-bda5ca412ad0"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Remove Term"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Parameters.RemoveParameterTermAction,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Fields:
+ - ID: "9541e67d-ce8c-4225-803d-33f7f29f09ef"
+ Hint: __Short description
+ Value: Remove partial value
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter - set [Name,,,specific] multilist parameter, remove [Term,,,term] (if exists)"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Set.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Set.yml
new file mode 100644
index 0000000..93fa359
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Parameter - Set.yml
@@ -0,0 +1,82 @@
+---
+ID: "90db2b4b-3e5c-4f9d-8eb3-f386347f4f6a"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Parameter - Set"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Parameters.SetParameterAction,Community.Foundation.DesignBot
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Angiv parametre
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104333Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "angiv parametre til [Parameters,Text,,value]"
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Parameters einstellen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T104809Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter einstellen auf [Parameter,Text,,value]"
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20080925T143242
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Parameter - set [Name,,,specific] parameter to [Value,,,value]"
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: パラメーターを設定
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20161221T105214Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "パラメーターを [Parameters,Text,,特定の値] に設定する"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - All in Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - All in Placeholder.yml
new file mode 100644
index 0000000..7274064
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - All in Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "bffec3f4-9f8a-470e-a454-d8fc52531e9c"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - All in Placeholder"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - renderings by [PlaceholderPath,,,specific] placeholder path"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - All.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - All.yml
new file mode 100644
index 0000000..2682e89
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - All.yml
@@ -0,0 +1,28 @@
+---
+ID: "b0c976e8-b99f-437c-9dfe-3e67a17a3bc4"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - All"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickAll, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - all renderings (of selected device)"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Clear.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Clear.yml
new file mode 100644
index 0000000..b7f72c5
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Clear.yml
@@ -0,0 +1,28 @@
+---
+ID: "cd96ba64-565d-4584-b35b-eadea1faeea0"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Clear"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.ClearPicks, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - none, clear all selections"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Device.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Device.yml
new file mode 100644
index 0000000..f76cdc1
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Device.yml
@@ -0,0 +1,28 @@
+---
+ID: "3a2c8ebb-0327-4126-ac5f-768d7f6849eb"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Device"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickDevice, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - [DeviceId,Tree,root=/sitecore/layout/Devices,specific] device"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering by Placeholder an.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering by Placeholder an.yml
new file mode 100644
index 0000000..570ed5f
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering by Placeholder an.yml
@@ -0,0 +1,28 @@
+---
+ID: "917b87c4-b6e9-46e6-9dee-b92a5bc12fc9"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First Rendering by Placeholder and Param"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickFirstRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path with [Param,,,specific] parameter [operatorid,StringOperator,,compares to] [Value,,,value], take first"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering by Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering by Placeholder.yml
new file mode 100644
index 0000000..96de313
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering by Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "63b97d48-8e7a-489e-86bf-ff9444cd5206"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First Rendering by Placeholder"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickFirstRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path, take first"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering.yml
new file mode 100644
index 0000000..3d2ccda
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First Rendering.yml
@@ -0,0 +1,28 @@
+---
+ID: "5ec49499-ad66-4a5f-aaaa-146b9537fdd2"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First Rendering"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickFirstRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering, take first"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First in Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First in Placeholder.yml
new file mode 100644
index 0000000..a72ce61
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - First in Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "e6fffcb3-835d-48b3-926c-271c2e6949ff"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - First in Placeholder"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickFirstRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [PlaceholderPath,,,specific] placeholder path, take first"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Inverse.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Inverse.yml
new file mode 100644
index 0000000..40c265e
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Inverse.yml
@@ -0,0 +1,28 @@
+---
+ID: "08edc6bb-8731-46b3-ac60-dfa3cd4d27e7"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Inverse"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.InvertSelection, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - opposite, invert selections"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last Rendering by Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last Rendering by Placeholder.yml
new file mode 100644
index 0000000..e2ac14b
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last Rendering by Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "c82515ec-2de3-4d3b-a580-6474084ee311"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Last Rendering by Placeholder"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickLastRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path, take last"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last Rendering.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last Rendering.yml
new file mode 100644
index 0000000..e59efc2
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last Rendering.yml
@@ -0,0 +1,28 @@
+---
+ID: "40fbef4a-cb7c-499c-8f5d-6db5989e8606"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Last Rendering"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickLastRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering, take last"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last in Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last in Placeholder.yml
new file mode 100644
index 0000000..b5ffbe2
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Last in Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "3afef4d3-3faf-414a-bf78-242d0600a50d"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Last in Placeholder"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickLastRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [PlaceholderPath,,,specific] placeholder path, take last"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Placeholder match.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Placeholder match.yml
new file mode 100644
index 0000000..e1e055a
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Placeholder match.yml
@@ -0,0 +1,28 @@
+---
+ID: "1b345278-cc26-4891-b4ad-807fdac06bae"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Placeholder match"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderingsByPlaceholder, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - renderings with placeholder path [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Placeholder with Range.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Placeholder with Range.yml
new file mode 100644
index 0000000..a58b8b5
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Placeholder with Range.yml
@@ -0,0 +1,28 @@
+---
+ID: "5d1effd9-6f2e-48ba-a5ea-e168e8913854"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Placeholder with Range"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - renderings by [PlaceholderPath,,,specific] placeholder path, skip [Skip,PositiveInteger,,number] take [Take,PositiveInteger,,number]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Param.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Param.yml
new file mode 100644
index 0000000..de31287
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Param.yml
@@ -0,0 +1,28 @@
+---
+ID: "3af43c06-b6cb-437b-b48a-20b8911ebaf4"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Rendering by Param"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering with [Param,,,specific] parameter [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Placeholder and Para.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Placeholder and Para.yml
new file mode 100644
index 0000000..6735d12
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Placeholder and Para.yml
@@ -0,0 +1,28 @@
+---
+ID: "34f53fdd-0c99-4da0-a46b-7d60b3f21fd8"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Rendering by Placeholder and Param"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path with [Param,,,specific] parameter [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Placeholder match.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Placeholder match.yml
new file mode 100644
index 0000000..88488a7
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Rendering by Placeholder match.yml
@@ -0,0 +1,28 @@
+---
+ID: "50291657-5b6e-4e5c-9193-81373d44801d"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Rendering by Placeholder match"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderingsByPlaceholder, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - rendering by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering with placeholder path [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Datasource Field.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Datasource Field.yml
new file mode 100644
index 0000000..d094adf
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Datasource Field.yml
@@ -0,0 +1,28 @@
+---
+ID: "2f8de26b-717f-41f8-825a-8e5924f7d8f5"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings by Datasource Field"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - renderings by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering whose datasource has [DsFieldId,Tree,root=/sitecore/Templates,specific] field [operatorid,StringOperator,,compares to] [Value,,,value]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Placeholder with Ra.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Placeholder with Ra.yml
new file mode 100644
index 0000000..edbc330
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Placeholder with Ra.yml
@@ -0,0 +1,28 @@
+---
+ID: "082b6ed4-980b-47f5-bf40-92dfd8d9553a"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings by Placeholder with Range"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - renderings by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path, skip [Skip,PositiveInteger,,number] take [Take,PositiveInteger,,number]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Placeholder.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Placeholder.yml
new file mode 100644
index 0000000..5f045c7
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings by Placeholder.yml
@@ -0,0 +1,28 @@
+---
+ID: "be6dc7b3-27df-4358-bb0e-b8c7381407c2"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings by Placeholder"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - renderings by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering in [PlaceholderPath,,,specific] placeholder path"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings.yml
new file mode 100644
index 0000000..6a61d65
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Pick - Renderings.yml
@@ -0,0 +1,28 @@
+---
+ID: "0331ed24-fa79-4b6d-b6d6-c17915bc3671"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Pick - Renderings"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Choose.PickRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Pick - renderings by [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - move to.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - move to.yml
new file mode 100644
index 0000000..2d8e72b
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - move to.yml
@@ -0,0 +1,28 @@
+---
+ID: "ab0a78cd-7161-4863-b642-0fe15eee923f"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - move to"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.MoveToPlaceholder, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Placeholders - move components within placeholder path [FromPath,,,A] to [ToPath,,,B] (honoring substructure)"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - remove segment.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - remove segment.yml
new file mode 100644
index 0000000..89333a0
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - remove segment.yml
@@ -0,0 +1,28 @@
+---
+ID: "47e77a7d-30ab-46f7-b595-e14c59f826e4"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - remove segment"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.RemoveSegment, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Placeholders - remove placeholder segment that [operatorid,StringOperator,,compares to] [Value,,,text] from selected renderings"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - set.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - set.yml
new file mode 100644
index 0000000..079561d
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - set.yml
@@ -0,0 +1,28 @@
+---
+ID: "b67f50cc-c697-43cc-b93f-3a6cc5f78ff2"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - set"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.SetPlaceholders, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Placeholders - set selected renderings to [Path,,,specific] placeholder path"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - swap.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - swap.yml
new file mode 100644
index 0000000..305830c
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Placeholders - swap.yml
@@ -0,0 +1,28 @@
+---
+ID: "0a7f150b-9493-43ad-96c7-9e3384861b2e"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Placeholders - swap"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.SwapPlaceholderContent, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Placeholders - swap content between placeholder paths [PathA,,,A] and [PathB,,,B]"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move before.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move before.yml
new file mode 100644
index 0000000..232aaa2
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move before.yml
@@ -0,0 +1,28 @@
+---
+ID: "e42e1445-9ace-4723-9758-16d5c08b0899"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - move before"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.MoveRenderingIndexesBefore, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Renderings - move selected to before [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move to front.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move to front.yml
new file mode 100644
index 0000000..51a36cf
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move to front.yml
@@ -0,0 +1,28 @@
+---
+ID: "686df7a5-b696-4a9c-9a12-7a85cd98063a"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - move to front"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.MoveRenderingsToFront, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Renderings - move selected to front"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move.yml
new file mode 100644
index 0000000..9e19e54
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - move.yml
@@ -0,0 +1,28 @@
+---
+ID: "9a0c8d71-bdc8-4bbb-9cb3-79dfc0a50100"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - move"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.MoveRenderingIndexes, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Renderings - move selected to after [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] rendering"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - remove all selected.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - remove all selected.yml
new file mode 100644
index 0000000..77d923c
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - remove all selected.yml
@@ -0,0 +1,28 @@
+---
+ID: "64c1a868-174e-4e51-8b52-439a03b34c12"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - remove all selected"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Remove.DeleteRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Renderings - remove from page all selected renderings"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - remove certain selected.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - remove certain selected.yml
new file mode 100644
index 0000000..4e03075
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - remove certain selected.yml
@@ -0,0 +1,28 @@
+---
+ID: "d4a104d7-5444-46f4-aa50-40b66dc2ef98"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - remove certain selected"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Remove.DeleteRendering, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Renderings - remove from page all selected [RenderingId,Tree,root=/sitecore/layout/Renderings,specific] renderings"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - sort by placeholder paths.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - sort by placeholder paths.yml
new file mode 100644
index 0000000..6d7ab81
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Renderings - sort by placeholder paths.yml
@@ -0,0 +1,28 @@
+---
+ID: "bcbb6a02-3bf9-419a-9e4f-97297d20dfb6"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "f90052a5-b4e6-4e6d-9812-1e1b88a6fcea"
+Path: "/sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Renderings - sort by placeholder paths"
+DB: master
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "ff55d5a7-6d4b-4cd1-83e0-bac268073f66"
+ Hint: Type
+ Value: Community.Foundation.DesignBot.Rules.Actions.Placeholders.SortRenderings, Community.Foundation.DesignBot
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181027T224128Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
+ - ID: "eeb36a3b-40d9-4af5-862a-de257b84dca3"
+ Hint: Text
+ Value: "Renderings - sort all renderings by placeholder path"
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Tags.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Tags.yml
new file mode 100644
index 0000000..d7eb00d
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Tags.yml
@@ -0,0 +1,26 @@
+---
+ID: "949a9512-86af-4022-94f3-42f1f4dcbaa8"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "96c8e5dd-63c3-496b-a97c-a3e37e1dacba"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Tags
+DB: master
+BranchID: "9a72c539-dbf8-4dad-96d3-a298fc04add6"
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value: "{FD4268C6-E588-4C19-B141-B1AAD488887D}"
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T220326Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Tags/Default.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Tags/Default.yml
new file mode 100644
index 0000000..365c5d1
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Tags/Default.yml
@@ -0,0 +1,27 @@
+---
+ID: "6882785b-6821-4702-9093-9bb28fd59436"
+Parent: "949a9512-86af-4022-94f3-42f1f4dcbaa8"
+Template: "854ba861-63ea-4a0c-8c7b-541e9a7ec4c1"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Tags/Default
+DB: master
+BranchID: "9a72c539-dbf8-4dad-96d3-a298fc04add6"
+SharedFields:
+- ID: "42f77151-098f-496a-94cf-590b7edeeabe"
+ Hint: Tags
+ Type: Multilist
+ Value: "{CA29398A-ED15-4723-B025-05D4EC12E629}"
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value: "{6F0688E4-7B16-482F-845B-35836FD15D14}"
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T220326Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Visibility.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Visibility.yml
new file mode 100644
index 0000000..ee95061
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Definitions/DesignBot/Visibility.yml
@@ -0,0 +1,26 @@
+---
+ID: "9419e4cf-f545-49c2-82c5-c3af5a1a50fd"
+Parent: "42d05b0f-1f29-4e64-9aa1-c65d6df7cf9e"
+Template: "aa91a868-02f2-41d3-8b78-1cad91b4dcae"
+Path: /sitecore/system/Settings/Rules/Definitions/Elements/DesignBot/Visibility
+DB: master
+BranchID: "9a72c539-dbf8-4dad-96d3-a298fc04add6"
+SharedFields:
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value: "{283F6CD6-EFB8-47AC-946A-ABB17FA45ECB}"
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T220327Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot.yml
new file mode 100644
index 0000000..52569a7
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot.yml
@@ -0,0 +1,28 @@
+---
+ID: "09eb22ca-e0a4-47ab-a293-e9ea537e9f99"
+Parent: "a3572733-5062-43e9-a447-54698bc1c637"
+Template: "6d82fcd8-c379-443c-97a9-c6423c71e7d5"
+Path: /sitecore/system/Modules/PowerShell/Script Library/DesignBot
+DB: master
+SharedFields:
+- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
+ Hint: __Icon
+ Value: Software/32x32/jar_bean.png
+- ID: "218ca464-cb77-4c97-b141-34871ecae00b"
+ Hint: Enabled
+ Type: Checkbox
+ Value: 1
+- ID: "6d22bcce-2799-4324-b0d9-c44df5effaf3"
+ Hint: Description
+ Value: DesignBot Context Menu Option
+- ID: "9911a28e-2120-4ab0-9113-5bae386769c1"
+ Hint: Module Version
+ Value: 1.0
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20141129T222657Z
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor.yml
new file mode 100644
index 0000000..0038a11
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor.yml
@@ -0,0 +1,14 @@
+---
+ID: "34982275-72ab-40f8-8029-b0d2df906438"
+Parent: "09eb22ca-e0a4-47ab-a293-e9ea537e9f99"
+Template: "ab154d3d-1126-4ab4-ac21-8b86e6bd70ea"
+Path: /sitecore/system/Modules/PowerShell/Script Library/DesignBot/Content Editor
+DB: master
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20141129T162713
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor/Context Menu.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor/Context Menu.yml
new file mode 100644
index 0000000..3b5648b
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor/Context Menu.yml
@@ -0,0 +1,14 @@
+---
+ID: "86317df1-c537-4c03-8f19-53a3786e19f2"
+Parent: "34982275-72ab-40f8-8029-b0d2df906438"
+Template: "ab154d3d-1126-4ab4-ac21-8b86e6bd70ea"
+Path: /sitecore/system/Modules/PowerShell/Script Library/DesignBot/Content Editor/Context Menu
+DB: master
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20141129T162723
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor/Context Menu/DesignBot.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor/Context Menu/DesignBot.yml
new file mode 100644
index 0000000..768eb25
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.PowerShell/DesignBot/Content Editor/Context Menu/DesignBot.yml
@@ -0,0 +1,54 @@
+---
+ID: "957ae84f-a008-476b-b3a1-e34de543a950"
+Parent: "86317df1-c537-4c03-8f19-53a3786e19f2"
+Template: "dd22f1b3-bd87-4db2-9e7d-f7a496888d43"
+Path: /sitecore/system/Modules/PowerShell/Script Library/DesignBot/Content Editor/Context Menu/DesignBot
+DB: master
+SharedFields:
+- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
+ Hint: __Icon
+ Value: office/32x32/robot.png
+- ID: "b1a94ff0-6897-47c0-9c51-aa6acb80b1f0"
+ Hint: Script
+ Value: |
+ $page = Get-Item .
+ $programItem = Get-Item "master:/sitecore/system/Settings/Rules/DesignBot/Rules"
+
+ $props = @{
+ Parameters = @(
+ @{ Name = "programItem"; Title = "Choose Program"; Root = "/sitecore/system/Settings/Rules/DesignBot/Rules/"; Tab = "General" },
+ @{ Name = "crawlDepth"; Title = "Crawl Depth (0=this item only)"; Tab = "General" }
+ )
+ Title = ("DesignBot - for " + $page.DisplayName )
+ OkButtonName = "Proceed"
+ CancelButtonName = "Abort"
+ Width = 600
+ Height = 700
+ }
+
+ $result = Read-Variable @props
+
+ if ($result -ne "ok") {
+ Exit
+ }
+
+ $bot = New-Object Community.Foundation.DesignBot.Services.DesignBotService
+ $response = $bot.ApplyDesign($programItem, $page, $crawlDepth)
+
+ # Show-ModalDialog -Control "OutputResult" -Parameters @{btn_0="Ok"; te="Design Program Complete. $response"; cp="Important Questions"} -Height 120 -Width 400
+Languages:
+- Language: en
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: DesignBot...
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181026T220925Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot.yml
new file mode 100644
index 0000000..1b564d3
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot.yml
@@ -0,0 +1,29 @@
+---
+ID: "aebc97c1-8e3c-4073-a849-83569cdedd6f"
+Parent: "1057c235-c5c0-4eb7-8f77-ea51eb9e20ee"
+Template: "dda66314-03f3-4c89-84a9-39dffb235b06"
+Path: /sitecore/system/Settings/Rules/DesignBot
+DB: master
+SharedFields:
+- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
+ Hint: __Icon
+ Value: office/32x32/robot.png
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value:
+Languages:
+- Language: en
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value:
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20150119T164126
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\ameagle
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Rules.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Rules.yml
new file mode 100644
index 0000000..75d3a65
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Rules.yml
@@ -0,0 +1,26 @@
+---
+ID: "a6fc9765-0343-4f2a-a20d-3c9fa895996d"
+Parent: "aebc97c1-8e3c-4073-a849-83569cdedd6f"
+Template: "8ea2cf67-4250-47a2-aeca-4f70fd200dc7"
+Path: /sitecore/system/Settings/Rules/DesignBot/Rules
+DB: master
+SharedFields:
+- ID: "1172f251-dad4-4efb-a329-0c63500e4f1e"
+ Hint: __Masters
+ Type: TreelistEx
+ Value: "{341B47CA-10DE-471E-B82D-D7FBB5C48877}"
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value:
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20150119T164127
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\ameagle
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Tags.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Tags.yml
new file mode 100644
index 0000000..ea14b59
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Tags.yml
@@ -0,0 +1,22 @@
+---
+ID: "61c64655-9d11-4894-8e8c-4121a7c4c1e8"
+Parent: "aebc97c1-8e3c-4073-a849-83569cdedd6f"
+Template: "96c8e5dd-63c3-496b-a97c-a3e37e1dacba"
+Path: /sitecore/system/Settings/Rules/DesignBot/Tags
+DB: master
+SharedFields:
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value:
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20150119T164127
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\ameagle
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Tags/Default.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Tags/Default.yml
new file mode 100644
index 0000000..aa0d675
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Rules/DesignBot/Tags/Default.yml
@@ -0,0 +1,32 @@
+---
+ID: "bbe87145-474a-438a-be6d-a4d797a71d34"
+Parent: "61c64655-9d11-4894-8e8c-4121a7c4c1e8"
+Template: "854ba861-63ea-4a0c-8c7b-541e9a7ec4c1"
+Path: /sitecore/system/Settings/Rules/DesignBot/Tags/Default
+DB: master
+SharedFields:
+- ID: "42f77151-098f-496a-94cf-590b7edeeabe"
+ Hint: Tags
+ Type: Multilist
+ Value: |
+ {CA29398A-ED15-4723-B025-05D4EC12E629}
+ {09340671-13CF-4181-A706-BE150B00D735}
+ {D8933FCB-48F3-468E-8FB6-8F2B5CFAF404}
+ {CCDEDBA3-3677-433E-BA09-64A3094808C9}
+ {83E58187-D1E5-4FB8-953E-EE89816EC0B5}
+ {5A355A23-0148-48CB-9017-90A696EAF155}
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value:
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20150119T164127
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\ameagle
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Tags/DesignBot.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Tags/DesignBot.yml
new file mode 100644
index 0000000..c2ebe6b
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Tags/DesignBot.yml
@@ -0,0 +1,70 @@
+---
+ID: "ca29398a-ed15-4723-b025-05d4ec12e629"
+Parent: "dadb4f93-477f-491f-a905-c4005c452e67"
+Template: "1a9b6300-4652-477c-a4b5-b2a64e86b29f"
+Path: /sitecore/system/Settings/Rules/Definitions/Tags/DesignBot
+DB: master
+SharedFields:
+- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
+ Hint: __Icon
+ Value: office/32x32/robot.png
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value:
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Indstillinger for indsætning
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T180416:635367242567748611"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Einfügeoptionen
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T181523:635367249239889994"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20120906T165355
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: 挿入オプション
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T182651:635367256117966569"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Tags/DesignBot/Visibility.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Tags/DesignBot/Visibility.yml
new file mode 100644
index 0000000..271b40d
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Tags/DesignBot/Visibility.yml
@@ -0,0 +1,67 @@
+---
+ID: "5fd62b6e-b08a-4a6a-945d-599734965444"
+Parent: "ca29398a-ed15-4723-b025-05d4ec12e629"
+Template: "aa91a868-02f2-41d3-8b78-1cad91b4dcae"
+Path: /sitecore/system/Settings/Rules/Definitions/Tags/DesignBot/Visibility
+DB: master
+SharedFields:
+- ID: "f6d8a61c-2f84-4401-bd24-52d2068172bc"
+ Hint: __Originator
+ Value:
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Synlighed
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T181003:635367246039275716"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Sichtbarkeit
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T182032:635367252323773901"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20120906T165356
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: 表示/非表示
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T183329:635367260095432888"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot.yml
new file mode 100644
index 0000000..5ecbb6d
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot.yml
@@ -0,0 +1,18 @@
+---
+ID: "562609b4-311f-4d1f-ac86-60ffd699732a"
+Parent: "b26bd035-8d0a-4df3-8f67-2de3c7fdd74a"
+Template: "0437fee2-44c9-46a6-abe9-28858d9fee8c"
+Path: /sitecore/templates/Foundation/DesignBot
+DB: master
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T220857Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/DesignBot Program.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/DesignBot Program.yml
new file mode 100644
index 0000000..28c5f7c
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/DesignBot Program.yml
@@ -0,0 +1,29 @@
+---
+ID: "341b47ca-10de-471e-b82d-d7fbb5c48877"
+Parent: "562609b4-311f-4d1f-ac86-60ffd699732a"
+Template: "ab86861a-6030-46c5-b394-e8f99e8b87db"
+Path: /sitecore/templates/Foundation/DesignBot/DesignBot Program
+DB: master
+SharedFields:
+- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
+ Hint: __Icon
+ Value: office/32x32/pci_card.png
+- ID: "12c33f3f-86c5-43a5-aeb4-5598cec45116"
+ Hint: __Base template
+ Type: tree list
+ Value: "{1930BBEB-7805-471A-A3BE-4858AC7CF696}"
+- ID: "f7d48a55-2158-4f02-9356-756654404f73"
+ Hint: __Standard values
+ Value: "{55742B6E-33DF-4598-A09D-D90A89B84837}"
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T221109Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/DesignBot Program/__Standard Values.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/DesignBot Program/__Standard Values.yml
new file mode 100644
index 0000000..352ba81
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/DesignBot Program/__Standard Values.yml
@@ -0,0 +1,23 @@
+---
+ID: "55742b6e-33df-4598-a09d-d90a89b84837"
+Parent: "341b47ca-10de-471e-b82d-d7fbb5c48877"
+Template: "341b47ca-10de-471e-b82d-d7fbb5c48877"
+Path: /sitecore/templates/Foundation/DesignBot/DesignBot Program/__Standard Values
+DB: master
+SharedFields:
+- ID: "1172f251-dad4-4efb-a329-0c63500e4f1e"
+ Hint: __Masters
+ Type: TreelistEx
+ Value: "{14F9A24A-5697-40AD-A429-6558A90D5F5B}"
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T221324Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule.yml
new file mode 100644
index 0000000..2f8f6f1
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule.yml
@@ -0,0 +1,29 @@
+---
+ID: "14f9a24a-5697-40ad-a429-6558a90d5f5b"
+Parent: "562609b4-311f-4d1f-ac86-60ffd699732a"
+Template: "ab86861a-6030-46c5-b394-e8f99e8b87db"
+Path: /sitecore/templates/Foundation/DesignBot/Program Rule
+DB: master
+SharedFields:
+- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
+ Hint: __Icon
+ Value: Software/32x32/shape_ellipse.png
+- ID: "12c33f3f-86c5-43a5-aeb4-5598cec45116"
+ Hint: __Base template
+ Type: tree list
+ Value: "{34E1F0D9-CCFF-4F03-A38D-933437AA3A2A}"
+- ID: "f7d48a55-2158-4f02-9356-756654404f73"
+ Hint: __Standard values
+ Value: "{809C0ECE-2D8F-4230-858A-983927436822}"
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T221000Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data.yml
new file mode 100644
index 0000000..1168449
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data.yml
@@ -0,0 +1,63 @@
+---
+ID: "12d9d41d-06e7-4ca1-b985-d6ce6f0dba16"
+Parent: "14f9a24a-5697-40ad-a429-6558a90d5f5b"
+Template: "e269fbb5-3750-427a-9149-7aa950b49301"
+Path: /sitecore/templates/Foundation/DesignBot/Program Rule/Data
+DB: master
+Languages:
+- Language: da
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Data
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T180144:635367241049018120"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "de-DE"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Daten
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T181335:635367248151147401"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20081103T155013
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "ja-JP"
+ Fields:
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: データ
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T182425:635367254657976688"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data/Name.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data/Name.yml
new file mode 100644
index 0000000..baa8b1c
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data/Name.yml
@@ -0,0 +1,79 @@
+---
+ID: "406fef24-0886-49c5-86d2-fbabf9ceb860"
+Parent: "12d9d41d-06e7-4ca1-b985-d6ce6f0dba16"
+Template: "455a3e98-a627-4b40-8035-e683a0331ac7"
+Path: /sitecore/templates/Foundation/DesignBot/Program Rule/Data/Name
+DB: master
+SharedFields:
+- ID: "ab162cc0-dc80-4abf-8871-998ee5d7ba32"
+ Hint: Type
+ Value: "Single-Line Text"
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 100
+Languages:
+- Language: da
+ Fields:
+ - ID: "19a69332-a23e-4e70-8d16-b2640cb24cc8"
+ Hint: Title
+ Value: Navn
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Navn
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T180539:635367243390241647"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "de-DE"
+ Fields:
+ - ID: "19a69332-a23e-4e70-8d16-b2640cb24cc8"
+ Hint: Title
+ Value: Name
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Name
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T181625:635367249859893962"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20081103T155013
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "ja-JP"
+ Fields:
+ - ID: "19a69332-a23e-4e70-8d16-b2640cb24cc8"
+ Hint: Title
+ Value: 名前
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: 名前
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T182810:635367256907801552"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data/Rule.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data/Rule.yml
new file mode 100644
index 0000000..646396e
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/Data/Rule.yml
@@ -0,0 +1,86 @@
+---
+ID: "709404de-b4a9-46dc-a0ef-d1c7734454ad"
+Parent: "12d9d41d-06e7-4ca1-b985-d6ce6f0dba16"
+Template: "455a3e98-a627-4b40-8035-e683a0331ac7"
+Path: /sitecore/templates/Foundation/DesignBot/Program Rule/Data/Rule
+DB: master
+SharedFields:
+- ID: "1eb8ae32-e190-44a6-968d-ed904c794ebf"
+ Hint: Source
+ Value: /sitecore/system/settings/Rules/DesignBot
+- ID: "ab162cc0-dc80-4abf-8871-998ee5d7ba32"
+ Hint: Type
+ Value: Rules
+- ID: "ba3f86a2-4a1c-4d78-b63d-91c2779c1b5e"
+ Hint: __Sortorder
+ Value: 200
+- ID: "be351a73-fcb0-4213-93fa-c302d8ab4f51"
+ Hint: Shared
+ Type: Checkbox
+ Value: 1
+Languages:
+- Language: da
+ Fields:
+ - ID: "19a69332-a23e-4e70-8d16-b2640cb24cc8"
+ Hint: Title
+ Value: Regel
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Regel
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T180709:635367244290238059"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "de-DE"
+ Fields:
+ - ID: "19a69332-a23e-4e70-8d16-b2640cb24cc8"
+ Hint: Title
+ Value: Regel
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: Regel
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T181753:635367250739729590"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20081103T215013Z
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
+- Language: "ja-JP"
+ Fields:
+ - ID: "19a69332-a23e-4e70-8d16-b2640cb24cc8"
+ Hint: Title
+ Value: ルール
+ - ID: "b5e02ad9-d56f-4c41-a065-a133db87bdeb"
+ Hint: __Display name
+ Value: ルール
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: "20140526T183016:635367258162474783"
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\admin
diff --git a/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/__Standard Values.yml b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/__Standard Values.yml
new file mode 100644
index 0000000..d78fc4c
--- /dev/null
+++ b/src/Foundation/DesignBot/serialization/Foundation.DesignBot.Templates/DesignBot/Program Rule/__Standard Values.yml
@@ -0,0 +1,21 @@
+---
+ID: "809c0ece-2d8f-4230-858a-983927436822"
+Parent: "14f9a24a-5697-40ad-a429-6558a90d5f5b"
+Template: "14f9a24a-5697-40ad-a429-6558a90d5f5b"
+Path: /sitecore/templates/Foundation/DesignBot/Program Rule/__Standard Values
+DB: master
+Languages:
+- Language: en
+ Versions:
+ - Version: 1
+ Fields:
+ - ID: "25bed78c-4957-4165-998a-ca1b52f67497"
+ Hint: __Created
+ Value: 20181024T222053Z
+ - ID: "406fef24-0886-49c5-86d2-fbabf9ceb860"
+ Hint: Name
+ Value: $name
+ - ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
+ Hint: __Created by
+ Value: |
+ sitecore\jgregory