Compare commits

...

310 Commits

Author SHA1 Message Date
kgiszewski dc3c1a72a8 Add some null checks 2016-05-03 10:11:13 -04:00
kgiszewski 3a30c7ba40 Force tostring if a value is present 2016-05-02 13:59:58 -04:00
kgiszewski fb305c9d0e Fix label padding in the config 2016-04-28 11:35:05 -04:00
kgiszewski b71564bfb5 Merge branch 'pr/351' 2016-04-26 07:51:50 -04:00
kgiszewski ba8a6cf65c Merge branch 'master' into pr/351 2016-04-26 07:37:33 -04:00
kjac 394572a8fc Yet another stab at fixing it
By tracking the fieldsets that have been expanded (loaded), we can make
sure the submit watchers fire appropriately, even when the fieldsets are
collapsed down again.

Apart from hopefully fixing the publishing issues for collapsed
fieldsets, this also adds a performance gain if the users expand and
collapse the same fieldsets more than once, since the fieldsets now only
load the first time they're expanded (instead of every time).

This also - at least partially - fixes the validation issue #325
introduced by #301
2016-04-23 10:14:56 +02:00
kgiszewski c7114b63f5 Merge branch 'master' of github.com:imulus/Archetype 2016-04-18 11:02:10 -04:00
kgiszewski 9704a8b591 Merge branch 'pr/345' 2016-04-18 11:02:00 -04:00
kjac 0b6af3b4e1 Another stab at fixing publishing for collapsed fieldsets
Make sure we've loaded moment.js before attempting to use it.

Also a small update to styles to accommodate 7.4
2016-04-10 19:23:31 +02:00
kjac 4b874dc5b5 Another stab at fixing publishing for collapsed fieldsets 2016-04-06 20:40:29 +02:00
Kevin Giszewski a081d97546 Update README.md 2016-04-06 09:31:13 -04:00
kjac 6b79a508bb Fix publishing when all fieldsets are collapsed
Because of the lazy loading of property editors, the
submitWatcherOnSubmit method is not necessarily called when an Archetype
is saved. This is indeed the case when all fieldsets are collapsed.
2016-04-04 21:28:19 +02:00
kjac e1f67a738b Merge remote-tracking branch 'refs/remotes/imulus/master' 2016-04-04 20:34:37 +02:00
kgiszewski 4410f1bb81 Bump version to v1.13 2016-04-04 13:08:58 -04:00
kgiszewski 5c2a99987a Fix style so text won't overflow out. 2016-04-04 12:47:39 -04:00
kgiszewski 715a2bf6d5 Fixed missing dialogData from enablePublishing 2016-04-04 12:03:52 -04:00
kjac d9ffb4b097 Merge remote-tracking branch 'refs/remotes/origin/master' into publishing
# Conflicts:
#	app/less/archetype.less
2016-04-03 12:53:30 +02:00
kjac c409922469 Merge remote-tracking branch 'refs/remotes/imulus/master' 2016-04-03 12:43:03 +02:00
kgiszewski 6b40d1e20b Merge branch 'pr/348' 2016-04-02 19:17:51 -04:00
kgiszewski 3e91b1c2c3 Why do I have to keep committing this? 2016-04-02 19:14:30 -04:00
kgiszewski 38eafc0063 Merge branch 'pr/350' 2016-04-02 19:11:43 -04:00
kgiszewski 89aeca9bf0 Add version to json config 2016-04-02 19:11:39 -04:00
kgiszewski 2b6d87d97c Bump version to v1.12.4 2016-04-02 19:10:54 -04:00
kjac 1ca113b455 Fix issue 342 2016-03-31 23:44:52 +02:00
kjac 8228b2dae5 Scope icon styles to fieldset controls only 2016-03-31 08:17:43 +02:00
kjac 22f24ec882 Merge remote-tracking branch 'refs/remotes/imulus/master' 2016-03-31 08:02:33 +02:00
kjac e33eb863e6 #326 - support tags (and other built-in datatypes) 2016-03-29 16:01:14 +02:00
Kevin Giszewski 6bcf291c99 Update README.md 2016-03-29 09:41:05 -04:00
kjac a424a7e4f3 Revert addDefaultProperties to master and adjust addCustomProperties accordingly 2016-03-23 08:38:07 +01:00
kjac 75fa2bb1bb Fix formatting 2016-03-22 19:58:48 +01:00
kjac 5585244d32 Merge remote-tracking branch 'refs/remotes/origin/master' into publishing 2016-03-22 19:40:59 +01:00
kjac 41fa8fa40d Merge remote-tracking branch 'refs/remotes/imulus/master' 2016-03-22 19:38:10 +01:00
kjac 9336f4508a Handle publishing in UTC 2016-03-22 19:35:40 +01:00
kgiszewski f9e5012b4e Merge branch 'master' into pr/338 2016-03-22 11:59:44 -04:00
kgiszewski 61d215e16c Merge branch 'master' of github.com:imulus/Archetype 2016-03-22 11:53:21 -04:00
kgiszewski e1e34be10d Merge branch 'master' into pr/311 2016-03-22 11:36:37 -04:00
Kevin Giszewski 796be76d94 Merge pull request #339 from imulus/feature/74-style
Update style for 7.4
2016-03-21 14:57:49 -04:00
kjac 8f7024c32a Comments 2016-03-20 14:05:31 +01:00
kjac dea307ff8e Filter out fieldsets based on publishing 2016-03-20 13:51:14 +01:00
kjac d69a10de48 Clean up 2016-03-20 13:37:34 +01:00
kjac b93df7a4c0 Add custom properties to new fieldsets 2016-03-20 13:28:22 +01:00
kjac 48dbdebec5 Create expandable settings group and fix icon activation 2016-03-20 13:21:43 +01:00
kjac 65837fa74c Undo a few things 2016-03-20 12:08:23 +01:00
kjac 29a73336e3 Merge remote-tracking branch 'refs/remotes/imulus/master' into publishing 2016-03-20 12:04:52 +01:00
kjac 0dfa8edc95 Merge remote-tracking branch 'refs/remotes/imulus/master' 2016-03-20 12:03:54 +01:00
kjac 0584c4eda5 Prototype (work in progress) 2016-03-20 12:02:21 +01:00
kgiszewski 4eb901fbba Fix #318 2016-03-15 10:04:59 -04:00
Greg Fyans b7875dd850 Added native label for RJP.MultiUrlPicker data type 2016-03-15 10:28:14 +00:00
Kevin Giszewski 19989e556e Update README.md 2016-03-10 12:10:30 -05:00
Kevin Giszewski 9250d66953 Update README.md 2016-03-10 12:07:53 -05:00
kgiszewski fa0b1a4b3b Add a ref required 2016-03-10 11:27:44 -05:00
kgiszewski 73e875e67c Merge branch 'master' into pr/330 2016-03-10 11:19:05 -05:00
kgiszewski e061311689 Add overloads for single partial render and cleanup stuffs 2016-03-10 11:16:27 -05:00
kjac b36f83eaf6 Merge remote-tracking branch 'refs/remotes/imulus/master' 2016-03-05 21:14:47 +01:00
Jamie Gilbert d63f7a6a34 updated angular controller to find view when umbraco is in virtual directory (using relative path) 2016-02-24 17:00:32 +00:00
leekelleher 68c2f55111 Added support to ArchetypePublishedContent for Umbraco extension methods
For the `IPublishedContent` implementation, added support for `GetIndex()`, so that extension methods, such as `IsFirst()`, `IsLast()`, etc will work as expected.

Unfortunately we wont be able to support the `Siblings()`, (or `FollowingSibling`, `PrecedingSibling`) extension methods, as these perform an internal query to the node's parent's children - which in the context of Archetype data is not possible access.

Added unit-tests to support this enhancement.
2016-02-17 13:30:43 +00:00
Jamie Gilbert f22d3cdef3 Modified HTML helper to allow you to render a single fieldset from an Archtype model.
(I Needed to render the first review in a list of review blocks)
2016-02-05 14:33:02 +00:00
kgiszewski 13b59d0d61 Bump version to v1.12.3 2016-02-04 11:20:44 -05:00
kjac 188c09d3c1 Fix issue #323
Made the config dialogs do "live editing" instead of working on a copy
of the config model.
2016-01-23 14:56:28 +01:00
kjac 6d8770907c Fix path to courier project
The gruntfile had a wrong path to the Courier project, which messed up
the grunt setup.
2016-01-23 14:55:11 +01:00
kjac efbed9606d Merge remote-tracking branch 'refs/remotes/imulus/master' 2016-01-23 10:31:06 +01:00
leekelleher c862ecc36f Fixes #319 - Grunt/MSBuild
Sets the MSBuild project config from "Debug" to "Release".
2016-01-13 12:26:19 +00:00
bjarnef 523630416f Correct for attribute to match id of input
... futhermore add title tooltip with value of property alias like in
Umbraco core.
2016-01-05 22:19:08 +01:00
kgiszewski 990836bc37 Fix #315 2016-01-05 08:39:09 -05:00
kgiszewski bb194fff76 Fix #314 2016-01-05 08:35:35 -05:00
kgiszewski 16351df692 Fix #312 2016-01-04 15:02:02 -05:00
kgiszewski 213d3940ca Merge branch 'pr/310' 2015-12-15 11:26:52 -05:00
kgiszewski 8dfe1f3ca4 Keepin it DRY 2015-12-15 11:26:40 -05:00
kgiszewski 3291998171 Merge branch 'master' into pr/308 2015-12-15 11:04:18 -05:00
kgiszewski e640a9b4f4 This depends on a core PR. 2015-12-14 09:53:01 -05:00
Martin Abrahams 7df4d4cfcd Fix for issue #258, same issue as fileupload datatype, need to add empty validation property 2015-12-10 16:03:14 +11:00
kgiszewski bb056a01dd Update dll to v1.12.1 2015-12-03 08:44:40 -05:00
kgiszewski 608b12aa10 Revert "Fix #304"
This reverts commit f4e449f030.

Conflicts:
	app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs
2015-12-03 08:43:23 -05:00
kjac 6494327c77 Merge remote-tracking branch 'refs/remotes/imulus/master' 2015-11-29 17:04:39 +01:00
Tom Fulton 293aa7f6f3 Update grunt-umbraco-package to v1.0 2015-11-24 21:54:01 -08:00
kgiszewski 7e76e98c0f Bump version to 1.12.0 2015-11-16 13:25:54 -05:00
kgiszewski f4e449f030 Fix #304 2015-11-16 13:24:36 -05:00
kgiszewski 1e97caa7e8 Merge branch 'pr/303' 2015-11-16 12:50:11 -05:00
leekelleher b0dcefaf06 Refactored the PublishedContent/Property classes.
Streamlines how the properties are stored and retrieved internally, (dictionary is faster than linq loops).
Removed the `Initialize` method, as we can do the set-up within the constructor.
2015-11-05 11:58:45 +00:00
kgiszewski 716972bc17 Merge branch 'pr/301' 2015-11-04 15:34:11 -05:00
leekelleher 4d4eab39e8 ArchetypeModel to IPublishedContent
Adds extension methods for `ArchetypeModel` and `ArchetypeFieldsetModel` for converting to Umbraco's `IPublishedContent`.
Included unit-tests to support the deserialization and verify property-value retrieval.

Modifies `ArchetypePropertyModelExtensions.CreateDummyPropertyType` extension method, to test if the `PropertyValueConvertersResolver` is available, (otherwise the unit-tests throw an exception from Umbraco's `PublishedPropertyType`).
2015-11-04 15:43:39 +00:00
kgiszewski 6acaf65ec3 Add missing XML docs. 2015-11-02 11:35:37 -05:00
kgiszewski a2b2567350 Fix unit tests. 2015-11-02 10:55:02 -05:00
Mark f5f4e80800 Added "lazy loading" for fieldset properties
I've had a big performance problem when loading big child archetypes in
an archetype, by adding a ng-if the digest cycle isn't called directly
when loading the directive
2015-10-26 10:52:27 +01:00
Mark b42695bd0d Merge remote-tracking branch 'imulus/master' 2015-10-26 10:46:19 +01:00
kgiszewski f405239115 Fixed goofed up packages, bump to v1.11.1 2015-10-08 13:42:19 -04:00
kgiszewski 4be6a13fc0 This never got bumped up, but most people are past that version. 2015-10-08 09:00:19 -04:00
kgiszewski 99638ed0b0 Add missing twitter style 2015-10-08 08:49:22 -04:00
kgiszewski fd28df1bad Update Gruntfile to remove versioning files 2015-10-08 08:43:08 -04:00
kgiszewski 165a98c89e Add Twitter link 2015-10-08 08:07:35 -04:00
kgiszewski ca1214a09a Remove FieldsetToolbar option as it was only for the prototype. Tweak Gruntfile 2015-10-08 07:52:30 -04:00
Kenn Jacobsen 17062c6913 Subdivide fieldset options in dialog + use dialog footers in all dialogs 2015-10-08 08:56:48 +02:00
Kenn Jacobsen 16e73446fd Merge remote-tracking branch 'imulus/feature/options-ui' into feature/options-ui 2015-10-08 08:17:05 +02:00
Kenn Jacobsen e56356534e Merge remote-tracking branch 'imulus/master' 2015-10-08 08:13:09 +02:00
kgiszewski 21b933a0dc Version HTML 2015-10-07 17:34:35 -04:00
kgiszewski e3a2b66022 Version css and js files 2015-10-07 17:11:26 -04:00
kgiszewski 645198444b Add dll version to the config page 2015-10-07 16:28:00 -04:00
kgiszewski 0e9bef9048 Add logo asset, add headlines to dialogs 2015-10-07 16:11:15 -04:00
kgiszewski bd4398ff28 Bump version to 1.11 and some minor edits 2015-10-07 15:42:00 -04:00
kgiszewski a4f371a4ca Enforce one dialog at a time. 2015-10-07 15:34:30 -04:00
kgiszewski e465861da6 Add cancel/apply buttons 2015-10-07 13:57:49 -04:00
kgiszewski 3fdfa2b2c6 Removed the 'name' label as it takes up a fair bit of space and is sort of redundant 2015-10-07 13:19:24 -04:00
kgiszewski 9787af9ed6 Fixup some styles and move some controller functions for the grouping 2015-10-07 13:13:56 -04:00
kgiszewski b8fc0fb71c WIP 2015-10-07 12:20:09 -04:00
kgiszewski de7ed9328d Merge branch 'pr/296' 2015-10-07 09:32:46 -04:00
Kenn Jacobsen ee8b16eb9b Only show fieldset groups config when "multiple fieldsets" is enabled 2015-10-05 15:03:08 +02:00
Kenn Jacobsen 5465c1c899 Use exact match on group name 2015-10-05 14:37:11 +02:00
kgiszewski 3402f216b9 Add more verbose error logging 2015-10-05 08:13:50 -04:00
Kenn Jacobsen 490de7b3ff Move fieldset groups config to advanced settings 2015-10-05 09:42:31 +02:00
kjac 275b5d2207 Introduce fieldset groups 2015-10-04 21:39:50 +02:00
Kenn Jacobsen bc19e6dda1 Merge branch 'master' into fix-194-again 2015-10-02 13:42:50 +02:00
Kenn Jacobsen 3904b6527e Fix editor dragging once again 2015-10-02 13:40:09 +02:00
Tom Fulton d5fd59b954 Remove editorState from model before persisting 2015-09-28 23:26:07 -06:00
kgiszewski e01c50f08a Fix #289 2015-09-02 09:46:22 -04:00
kgiszewski 1e9c7d0a6c Final tweaks to css and version numbers 2015-08-25 12:59:26 -04:00
Kevin Giszewski 3cf153fc80 Merge pull request #286 from kjac/ui-overhaul
UI overhaul
2015-08-25 08:54:26 -04:00
Kenn Jacobsen 8e11a33031 Make sure fieldset names are not cropped 2015-08-19 15:22:53 +02:00
kgiszewski 5c95f59219 Bump version number 2015-08-19 09:04:41 -04:00
kgiszewski 01b59f28f1 Merge branch 'pr/287' into rc/ui-1 2015-08-19 08:33:54 -04:00
Mark f40e023420 Changed the way tags are stripped from tinymce content
See stackoverflow for a reference
2015-08-19 13:02:55 +02:00
Kenn Jacobsen 6d9c32e30d Localization 2015-08-19 12:40:44 +02:00
Kenn Jacobsen 2f48e9da9a Merge branch 'master' into ui-overhaul 2015-08-19 12:19:54 +02:00
Kenn Jacobsen 2aa71e48a3 Prettify the "default add" button a little 2015-08-19 11:57:39 +02:00
Kenn Jacobsen e6732d2a37 Close fieldtype picker when clicked outside it 2015-08-19 11:57:13 +02:00
Kenn Jacobsen a7dca93781 Moved some CSS hover rules to a more appropriate target 2015-08-19 07:35:41 +02:00
kjac 0ec0e213a2 Make the delete icon red on hover 2015-08-18 23:11:44 +02:00
kjac 6919c5a8b4 A bit more styling of carets + make empty headers clickable 2015-08-18 23:09:40 +02:00
kjac 6505323297 Removed obsolete dropdown toggles 2015-08-18 19:03:36 +02:00
kgiszewski ec8df1d465 Housekeeping 2015-08-18 13:03:11 -04:00
kjac 451f2773a4 Add fieldtype picker
...and removed old dropdowns. Plus a bit more styling.
2015-08-18 17:59:20 +02:00
Kenn Jacobsen f366305583 Overhaul WIP 2015-08-18 15:10:37 +02:00
kgiszewski 43a72ed5e5 Use relative paths instead of tilde due to core compatibility issues 2015-08-17 12:16:38 -04:00
kgiszewski 709198f943 Merge branch 'master' of github.com:imulus/Archetype 2015-08-17 11:53:44 -04:00
Kevin Giszewski 77f72ed72e Merge pull request #283 from kipusoep/master
Fixes for Virtual Directories #156
2015-08-17 11:47:52 -04:00
kgiszewski a03fe3af32 Remove some cruft 2015-08-17 11:47:08 -04:00
Stefan Kip 697a797c7e Fixes for Virtual Directories #156 2015-08-14 14:49:41 +02:00
kgiszewski cfe014ee45 Bump version number 2015-07-08 13:26:06 -04:00
kgiszewski d62fa05ab5 Handle 7.2.6 issue 2015-07-01 09:25:18 -04:00
kjac 662cf4c3bf More formatting 2015-06-26 14:17:52 +02:00
kjac d0b8314134 Formatting issue 2015-06-26 14:09:12 +02:00
kjac 8eb4786976 Revert API method GetByGuid() to its previous state
All default prevalue enrichment is now handled by the API method
GetAllPropertyEditors()
2015-06-26 14:08:00 +02:00
kjac 20155b5ca6 Move filenames collection to temporary editor state container 2015-06-26 11:30:51 +02:00
kjac 16c310f3c6 Ensure correct default prevalues for imagecropper 2015-06-26 11:27:54 +02:00
kjac 99d570dc97 Handle upload and image cropper clientside 2015-06-25 07:59:16 +02:00
kjac 2ae3e3ade9 Merge with imulus/master 2015-06-23 17:21:26 +02:00
Kevin Giszewski d4718e358c Merge pull request #279 from leekelleher/enhancement/helper-log-exception
ArchetypeHelper - added exception to Umbraco log
2015-06-18 08:05:10 -04:00
Kevin Giszewski bb91eb7036 Merge pull request #280 from leekelleher/upgrade/courier-assemblies
Upgraded Courier assemblies.
2015-06-18 08:03:58 -04:00
leekelleher 484f2c22a3 Added exception to Umbraco log, as VS was complaining about an unused ex. 2015-06-18 12:20:02 +01:00
leekelleher a2121cd8a7 Upgraded Courier assemblies.
Amended references to Courier constants (seems that there was some restructuring within Courier)
2015-06-18 12:17:44 +01:00
kgiszewski 2fb922fd6c Rework dropdown label to check for a value first 2015-06-15 15:56:45 -04:00
kgiszewski c2986d39a9 Added coreDropdown to label helpers 2015-06-15 15:46:51 -04:00
kgiszewski 8ee5488261 Merge branch 'master' of github.com:imulus/Archetype 2015-06-15 14:49:19 -04:00
kgiszewski c60c9e1c5d Fix #276 2015-06-15 14:48:50 -04:00
kgiszewski 8610f69c88 Bump version to v1.8 2015-06-04 13:26:19 -04:00
kgiszewski 34b4209de7 For some reason sorting the RTE reared its head again and I killed it (again). 2015-06-02 10:49:47 -04:00
Kevin Giszewski b6145c9275 Merge pull request #275 from imulus/feature/label-library
Allow args to be passed to label templates and begin label library
2015-06-01 13:54:43 -04:00
kgiszewski f51ca65659 Expose archetypePropertyEditorResource to controller 2015-06-01 13:53:18 -04:00
kgiszewski d026af9fd2 Expose archetypeCacheService on controller 2015-06-01 13:49:34 -04:00
kgiszewski 11fff5da1a Add media picker support 2015-06-01 13:43:42 -04:00
kgiszewski 788a5dd720 Wire up MNTP 2015-06-01 13:35:53 -04:00
kgiszewski 24e232b2cc Renaming binge 2015-06-01 12:12:33 -04:00
kgiszewski 5bdcb23933 Cache datatypes as they come back from server 2015-06-01 11:16:12 -04:00
kgiszewski 34b3ed3b47 Add archetypeCacheService 2015-06-01 10:13:29 -04:00
kgiszewski 50a486a9ac Discovered we should probably use a datatype cache based on the directive, so maybe a archetypeCacheService? 2015-06-01 10:09:22 -04:00
kgiszewski 4f4128a744 Fix some broken-ness 2015-06-01 10:02:32 -04:00
kgiszewski 4851797a83 Refactor a ton of things, add archetypeLabelService 2015-06-01 09:45:10 -04:00
kgiszewski 54a435dce7 Begin archetypeService 2015-05-29 08:55:08 -04:00
kgiszewski 03a170d716 Add RTE label template 2015-05-27 13:56:33 -04:00
kgiszewski 37976abc84 Handle arg detection better and change UrlPicker functionname 2015-05-27 13:47:23 -04:00
kgiszewski f7e96438be Handle null ref 2015-05-27 13:41:58 -04:00
kgiszewski f1c3caae2d Allow args to be passed to label templates and begin label library 2015-05-27 13:31:25 -04:00
kgiszewski 8f8078e12f Merge branch 'master' into pr/272 2015-05-26 08:33:34 -04:00
kgiszewski dbc9b872d8 Fix #274 2015-05-26 08:28:32 -04:00
Nicholas-Westby eef1b94586 Hide long fieldset headers with an ellipsis before overlapping buttons: https://github.com/imulus/Archetype/issues/271 2015-05-23 00:01:25 -07:00
kgiszewski 9bbf366fe2 Bump version to v1.7.5 2015-05-11 15:32:46 -04:00
kgiszewski 368a9f6c07 Fix for #268 2015-05-11 15:31:46 -04:00
kgiszewski d3b3f80f3d Add Umbraco as a dependency 2015-05-11 15:20:28 -04:00
kgiszewski 11f7881dd7 Merge branch 'master' of github.com:imulus/Archetype 2015-05-04 13:46:07 -04:00
kgiszewski 9894357469 Fix #268 (This is a temp fix until a better solution can be found) 2015-05-04 13:45:49 -04:00
kgiszewski 146a3770a1 Bump version to v1.7.4 2015-05-03 16:41:41 -04:00
kgiszewski caf9d1ac15 Fix grunt for debug 2015-04-29 08:53:18 -04:00
kgiszewski 614595ceb3 Finesse PR #269 2015-04-29 08:53:05 -04:00
kgiszewski d1b21a1ca7 Merge branch 'pr/269' 2015-04-29 08:13:40 -04:00
kgiszewski 54bc507049 Merge branch 'pr/267' 2015-04-29 08:12:56 -04:00
kgiszewski 037585458c Merge branch 'pr/266' 2015-04-29 08:12:15 -04:00
kgiszewski f52649eb9e Add Courier to the build process for distro 2015-04-29 08:08:08 -04:00
kgiszewski 423fedb954 Undo add Courier to distro per @leekelleher 's suggestion that it causes a ysod if Courier is not installed already 2015-04-29 07:46:37 -04:00
Kim Pilgaard b39312ccd2 Properties which no longer exist have no GUID. Remove these when reading and writing the data. 2015-04-29 08:56:17 +02:00
Gavin Faux b9c4be0bb6 PropertyEditorAlias null check
Don't try `PropertyValueConverters` for properties with null or empty
`PropertyEditorAlias`, prevents `System.NullReferenceException`  in
`PropertyValueConverter.IsConverter` implementations
2015-04-28 14:30:08 +01:00
Tom Van Rompaey 29285607a9 Small UX update for add button
Added class "archetypeAddButton" to the button so it can make use of the
CSS that is writen for it.
The button should also have a cursor: pointer on hover.
2015-04-25 16:16:04 +02:00
kgiszewski 909b87cea0 Add Courier dll to the distribution 2015-04-21 08:43:44 -04:00
kgiszewski 3d25f75fb9 Bump version number to v1.7.3 2015-04-16 08:54:36 -04:00
kgiszewski 6fa713f88e Change to the internal event 2015-04-15 15:32:08 -04:00
kgiszewski d9982fe3a2 Merge branch 'master' of github.com:imulus/Archetype 2015-04-15 15:30:11 -04:00
kgiszewski 588bdfe429 Update to Tom's latest packager 2015-04-15 15:30:03 -04:00
Kevin Giszewski 0174f6d78b Merge pull request #262 from kjac/submit-watcher
Fix #261
2015-04-15 15:29:33 -04:00
Kevin Giszewski 84144b6206 Update Readme 2015-04-10 11:27:11 -04:00
kjac 27910e8d22 Fix #261
Add a watch to the "formSubmitting" event for each property added to a
fieldset, to make sure Archetype gets the last say in the
"formSubmitting" event.
2015-04-04 21:57:49 +02:00
Tom Fulton 9bf413207f Fix logic issue with assemblyinfo patcher 2015-04-02 23:24:54 -06:00
kgiszewski e5cd3d0cb0 Bump Version to 1.7.2 2015-03-31 11:04:57 -04:00
leekelleher 032ee958c1 Minor whitespace formatting 2015-03-27 15:48:14 +00:00
Kevin Giszewski ef5bd7ccc8 Merge pull request #259 from sitereactor/master
Updates the Courier provider
2015-03-24 13:51:47 -04:00
Morten Christensen 7839e4a992 Updates the Courier provider to only use Courier code instead of relying on PropertyEditorConverters 2015-03-24 16:11:19 +01:00
kgiszewski 408c178348 Fix #194 2015-03-13 10:18:57 -04:00
kgiszewski 852b7a92a7 Update for v7.2.2 locale issue 2015-02-26 10:37:27 -05:00
kgiszewski 5a4118a1cc Bump version and fix clone issue 2015-01-27 11:05:43 -05:00
kgiszewski 4b603bf97f Bump Version Number 2015-01-27 10:53:17 -05:00
kgiszewski c8884c8d92 Add Cloning 2015-01-27 10:51:22 -05:00
kgiszewski dd843ce2c6 Make deep requests not the default 2015-01-27 10:01:59 -05:00
kgiszewski 8036ab72d0 Merge branch 'alt-label-template' 2015-01-27 09:44:36 -05:00
kgiszewski b25d8bdc4b Merge branch 'fix/datatype-caching' 2015-01-27 09:42:36 -05:00
Nicholas-Westby 023d99cc88 Improved performance of publish operations: https://github.com/imulus/Archetype/issues/238 2015-01-26 12:59:19 -08:00
kjac 1cc0586c75 Support alternative property in label template
Allow fieldset label templates to contain alternative/fallback property
aliases and/or functions by seperating with "|" - e.g.
{{title|myFunction(text)}}
2015-01-10 11:16:00 +01:00
kjac a16b61f03f Merge remote-tracking branch 'upstream/master' 2015-01-10 08:26:41 +01:00
Tom Fulton 7ea01cad86 Remove caching for property datatype dropdowns 2014-12-03 21:46:13 -07:00
Mads Krohn aea65a531d Tweak dropdown position for new fields
See related issue
2014-11-02 12:56:12 +01:00
Kevin Giszewski 482cb5a149 beta = gtfo 2014-11-02 12:56:12 +01:00
Kevin Giszewski 81ac5fbddb Update lang files 2014-11-02 12:56:11 +01:00
Kevin Giszewski 801baf355b Bump version number to v1.6 2014-11-02 12:56:10 +01:00
Kevin Giszewski a3b531caa4 Tidy up the PR 2014-11-02 12:56:10 +01:00
doronuziel71 1d680c612e Fixed type-o 2014-11-02 12:56:09 +01:00
doronuziel71 cdea3c1aec Fixed type-o 2014-11-02 12:56:09 +01:00
doronuziel71 37fa9c40d6 Introduced override default propety converter 2014-11-02 12:56:08 +01:00
Kevin Giszewski 774ba46e13 Flip-flop scope and fieldset 2014-11-02 12:56:07 +01:00
Kevin Giszewski 280a97c8d1 Expose FS (fieldsets) and Property (alias/value) for helping with creating Archetype from code 2014-11-02 12:56:07 +01:00
Kevin Giszewski 7dd3848bdf Expose serializer for those wanting to create Archetypes from code 2014-11-02 12:56:06 +01:00
leekelleher add44e533a Courier: Turns out that creating a new instance of PropertyItemProvider was a hack.
Replaced with getting the item-provider from the existing collection.
2014-11-02 12:56:05 +01:00
leekelleher 870b848e3b Bug fix with the Courier resolver 2014-11-02 12:56:05 +01:00
leekelleher b262d8a86f Set the project's assembly references to not "Copy Local".
As these pollute the /bin output folder during build.
2014-11-02 12:56:04 +01:00
leekelleher 5dba1a0895 Fixed the type-name for the error log messages 2014-11-02 12:56:03 +01:00
leekelleher 8f4857aba1 Fixed issue with Courier serialization.
When Courier was deserializing, it was treating any nested Archetype as a `JObject`.
The newer serializer routines in Archetype core resolve the previous issue.
2014-11-02 12:56:03 +01:00
leekelleher cd95404a08 PersistenceManager.Default was obsoleted, replaced calls with ExecutionContext.DatabasePersistence 2014-11-02 12:56:02 +01:00
leekelleher 7e7a4aff58 Upgraded Courier assemblies. 2014-11-02 12:56:01 +01:00
Mads Krohn c9d8952b7f Tweak dropdown position for new fields
See related issue
2014-10-02 14:46:26 +02:00
Kevin Giszewski 890b5674a6 beta = gtfo 2014-09-26 09:27:31 -04:00
Kevin Giszewski 7f5dbd31c9 Update lang files 2014-09-26 09:13:31 -04:00
Kevin Giszewski a2255aa037 Bump version number to v1.6 2014-09-25 14:27:52 -04:00
Kevin Giszewski 415a84f5c0 Tidy up the PR 2014-09-25 14:21:16 -04:00
doronuziel71 3a0eba401a Fixed type-o 2014-09-17 19:18:47 +03:00
doronuziel71 991d56dac1 Fixed type-o 2014-09-17 19:17:58 +03:00
doronuziel71 f704088bcb Merge remote-tracking branch 'upstream/master' 2014-09-17 18:37:00 +03:00
doronuziel71 a599215620 Introduced override default propety converter 2014-09-16 23:32:16 +03:00
Kevin Giszewski a6e76cb398 Flip-flop scope and fieldset 2014-09-16 13:55:54 -04:00
Kevin Giszewski 4fd134ac74 Expose FS (fieldsets) and Property (alias/value) for helping with creating Archetype from code 2014-09-08 10:39:13 -04:00
Kevin Giszewski 22b87c0a37 Merge branch 'develop' of github.com:imulus/Archetype into develop 2014-09-08 10:00:28 -04:00
Kevin Giszewski d707b55362 Expose serializer for those wanting to create Archetypes from code 2014-09-08 10:00:05 -04:00
Kevin Giszewski 37a195109c Merge pull request #220 from leekelleher/feature/courier-upgrade
Courier: Fix for PropertyItemProvider reference
2014-09-04 08:52:10 -04:00
leekelleher 205919ccae Courier: Turns out that creating a new instance of PropertyItemProvider was a hack.
Replaced with getting the item-provider from the existing collection.
2014-09-04 11:05:41 +01:00
leekelleher 04e57b7d6b Bug fix with the Courier resolver 2014-09-02 16:52:41 +01:00
Kevin Giszewski 9e8cc0c556 Merge pull request #218 from leekelleher/feature/courier-upgrade
Bug fix with the Courier resolver
2014-09-02 11:52:27 -04:00
Kevin Giszewski 8fe90c3b86 Merge pull request #216 from leekelleher/feature/courier-upgrade
Courier upgrade (UaaS)
2014-09-02 08:58:20 -04:00
Kevin Giszewski 99581b0aeb Merge pull request #217 from leekelleher/develop
Housekeeping
2014-09-02 08:57:35 -04:00
leekelleher d8939c59a0 Set the project's assembly references to not "Copy Local".
As these pollute the /bin output folder during build.
2014-09-02 13:30:21 +01:00
leekelleher e49fe6ee17 Fixed the type-name for the error log messages 2014-09-02 13:27:29 +01:00
leekelleher ca52f0a216 Fixed issue with Courier serialization.
When Courier was deserializing, it was treating any nested Archetype as a `JObject`.
The newer serializer routines in Archetype core resolve the previous issue.
2014-09-02 13:24:40 +01:00
leekelleher 08d4e4b51d PersistenceManager.Default was obsoleted, replaced calls with ExecutionContext.DatabasePersistence 2014-09-02 13:20:29 +01:00
leekelleher e9c51ee96e Upgraded Courier assemblies. 2014-09-02 13:20:15 +01:00
Kevin Giszewski b5f281cae0 Prefix property aliases to avoid core css conflicts (BREAKING) 2014-08-26 10:43:37 -04:00
Kevin Giszewski 3bbb27f85e Fix error state LESS and other stuffs 2014-08-26 10:43:13 -04:00
Kevin Giszewski 247eea3477 Merge branch 'develop' 2014-08-26 10:05:18 -04:00
Kevin Giszewski 8635fa7301 Cleanup the LESS even if a little 2014-08-26 10:05:02 -04:00
Rasmus John Pedersen e49a8d947d fixed bug with custom view 2014-08-22 10:46:45 +02:00
Kevin Giszewski 3e2e43d342 Update langs and bump version number 2014-08-21 13:00:52 -04:00
Jeavon Leopold 78ba99a52e Change Archetype value conversion attempt to pass in the Source value to ConvertSourceToObject instead of the Data value 2014-08-18 17:14:17 +01:00
Kevin Giszewski 42efa1a3d4 Merge branch 'pr/200'
Conflicts:
	app/directives/archetypeproperty.js
2014-08-18 09:43:06 -04:00
Kevin Giszewski d2f4fce808 Add enable deep requests 2014-08-18 08:55:13 -04:00
Kevin Giszewski d76a5f58d4 Merge branch 'develop' 2014-08-13 11:29:12 -04:00
Kevin Giszewski f6457416cc Make sort icon black
- WS cleanup
2014-08-13 11:28:57 -04:00
Kevin Giszewski c841813a74 decouple entityResource from the function call 2014-08-13 11:15:29 -04:00
Kevin Giszewski bcc7be94e7 fix typo 2014-08-13 11:05:27 -04:00
Kevin Giszewski e200c22244 More caching 2014-08-12 19:15:08 -04:00
Kevin Giszewski 244db7f19d Add caching to $http.gets 2014-08-12 19:04:20 -04:00
Kevin Giszewski 31f3d00b76 Add label helpers 2014-08-12 17:15:16 -04:00
Kevin Giszewski 07125bae84 Add ability to pass function as template 2014-08-12 16:56:23 -04:00
kjac f2a8286f00 Fix #131 again
Simplified the validation and fixed the problem mentioned in #131 with
only the last field in a fieldset being validated.
2014-08-11 19:12:38 +02:00
Kevin Giszewski 5725c0770e Bump version number to v1.4.1 2014-08-06 09:22:08 -04:00
Kevin Giszewski 210fbb8230 Fix for #158 2014-08-06 09:20:17 -04:00
Kevin Giszewski c8e398c726 Merge pull request #195 from imulus/feature/fix193
Fix for #193
2014-08-06 08:55:47 -04:00
Kevin Giszewski bfa882fa01 Fix for #193 2014-08-06 08:55:10 -04:00
Kevin Giszewski 876aea4007 Merge branch 'pr/186' into develop 2014-08-06 08:45:55 -04:00
Jeroen Breuer 07750c7537 Run ConvertDataToSource before ConvertSourceToObject 2014-08-05 13:17:34 +02:00
Kevin Giszewski 17a1577d09 Merge branch 'master' of github.com:imulus/Archetype 2014-07-31 13:55:07 -04:00
Kevin Giszewski 987f383139 Merge pull request #184 from imulus/fix/class-conflicts
Prefix fieldset class names to help avoid conflicts
2014-07-31 13:54:58 -04:00
Kevin Giszewski dc14f11f83 Merge pull request #191 from jbreuer/patch-5
Fix 4 for #187
2014-07-31 13:54:48 -04:00
Kevin Giszewski 500f4c4dee Merge pull request #190 from jbreuer/patch-4
Fix 3 for #187
2014-07-31 13:53:41 -04:00
Kevin Giszewski a16451df1f Merge pull request #189 from jbreuer/patch-3
Fix 2 for #187
2014-07-31 13:53:34 -04:00
Kevin Giszewski 9ac7877174 Merge pull request #188 from jbreuer/patch-2
Fix 1 for #187
2014-07-31 13:53:10 -04:00
Kevin Giszewski 4d3bcb68b3 Merge branch 'pr/188' into develop 2014-07-31 13:44:43 -04:00
Kevin Giszewski 30074fe198 Merge branch 'pr/191' into pr/188 2014-07-31 13:37:01 -04:00
Kevin Giszewski 7f0bd45a9d Merge branch 'pr/190' into pr/188 2014-07-31 13:36:59 -04:00
Kevin Giszewski 6045eed5c5 Merge branch 'pr/189' into pr/188 2014-07-31 13:36:55 -04:00
Jeroen Breuer 57ffa69ff5 Added node id 2014-07-31 12:12:35 +02:00
Jeroen Breuer 6b61dc978a Added node id 2014-07-31 12:11:51 +02:00
Jeroen Breuer c20aa64af2 Added node id 2014-07-31 12:11:02 +02:00
Jeroen Breuer 25826958a3 Fix 4 for #187 2014-07-30 16:34:33 +02:00
Jeroen Breuer b5bfbb5c25 Fix 3 for #187 2014-07-30 16:33:01 +02:00
Jeroen Breuer 9afaa024c0 Fix 2 for #187 2014-07-30 16:30:42 +02:00
Jeroen Breuer c58dcd80ff Fix 1 for #187 2014-07-30 16:26:42 +02:00
Jeroen Breuer b7c16ee6ef Fix for #185 2014-07-29 16:24:14 +02:00
tomfulton 786c547e0b Prefix fieldset class names to help avoid conflicts 2014-07-24 06:35:33 -06:00
kjac 1cbb7b3173 Merge with master 2014-06-16 16:57:51 +02:00
kjac 71be453ada Move property files collection clean-up
Moved the cleaning up of files selected for each property to the
SerializeForPersistence() method
2014-06-01 07:48:47 +02:00
kjac efae05b3ae Merge branch 'master' into upload-imagecrop-datatypes 2014-05-29 11:17:11 +02:00
kjac 84acd43ccf Enrich datatypes with default prevalues
Datatypes can have default prevalues, that are not saved as part of the
config and thus need to be added when loading the datatype - e.g. the
"focalPoint" prevalue for the image cropper datatype.
2014-05-29 11:14:45 +02:00
kjac 9fe756bacb Merge branch 'master' into upload-imagecrop-datatypes 2014-05-21 23:01:44 +02:00
kjac cd03b5a4f9 Test and fine tune 3rd level nested archetypes 2014-05-20 22:19:21 +02:00
kjac 07a62d7edf More file upload handling WIP 2014-05-20 21:28:29 +02:00
kjac a6c166d926 WIP handle file selection
Use FileManager to register the files selected for properties contained
within an Archetype
2014-05-18 18:19:20 +02:00
kjac c1bc555443 Merge branch 'master' into current-value-to-value-editor 2014-05-16 13:44:46 +02:00
kjac d4166f33e8 Correct currentValue for ValueEditor conversion
Ensure that the currentValue parameter sent to the fieldset property
ValueEditor ConvertEditorToDb() method contains the value that was
previously entered (if any) and not the one that was just entered.
2014-05-14 11:32:54 +02:00
94 changed files with 3862 additions and 1284 deletions
+3
View File
@@ -17,6 +17,9 @@ tmp/
pkg/*.nupkg
pkg/*.zip
*_versioned*
[Dd]ebug/
[Bb]uild/
[Rr]elease/
+173 -67
View File
@@ -1,13 +1,38 @@
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
var path = require('path')
var path = require('path');
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
pkgMeta: grunt.file.readJSON('config/meta.json'),
dest: grunt.option('target') || 'dist',
basePath: path.join('<%= dest %>', 'App_Plugins', '<%= pkgMeta.name %>'),
'string-replace': {
version: {
files: {
"app/controllers/controller_versioned.js": "app/controllers/controller.js",
"app/less/archetype_versioned.less": "app/less/archetype.less",
"app/views/archetype.config.developer.dialog_versioned.html": "app/views/archetype.config.developer.dialog.html",
"app/views/archetype.config.stylescript.dialog_versioned.html": "app/views/archetype.config.stylescript.dialog.html",
"app/views/archetype.config.fieldset.dialog_versioned.html": "app/views/archetype.config.fieldset.dialog.html",
"app/views/archetype.config_versioned.html": "app/views/archetype.config.html",
"app/views/archetype_versioned.html": "app/views/archetype.html",
"app/views/archetype.default_versioned.html": "app/views/archetype.default.html"
},
options: {
replacements: [{
pattern: /{{VERSION}}/g,
replacement: '/* Version <%= pkgMeta.version %> */'
},
{
pattern: /{{VERSION_HTML}}/g,
replacement: '<!-- Version <%= pkgMeta.version %> -->'
}]
}
}
},
watch: {
options: {
spawn: false,
@@ -16,22 +41,27 @@ module.exports = function(grunt) {
less: {
files: ['app/**/*.less'],
tasks: ['less:dist']
tasks: ['string-replace', 'less:dist']
},
js: {
files: ['app/**/*.js'],
tasks: ['concat:dist']
tasks: ['string-replace', 'concat:dist']
},
html: {
files: ['app/**/*.html'],
tasks: ['copy:html']
tasks: ['string-replace', 'copy:html']
},
dll: {
files: ['app/Umbraco/**/*.dll'],
tasks: ['copy:dll']
},
assets: {
files: ['assets/*.*'],
tasks: ['copy:assets']
}
},
@@ -41,7 +71,7 @@ module.exports = function(grunt) {
paths: ["app/less", "lib/less", "vendor"],
},
files: {
'<%= basePath %>/css/archetype.css': 'app/less/archetype.less',
'<%= basePath %>/css/archetype.css': 'app/less/archetype_versioned.less',
}
}
},
@@ -52,13 +82,20 @@ module.exports = function(grunt) {
},
dist: {
src: [
'app/controllers/controller.js',
'app/controllers/controller_versioned.js',
'app/controllers/config.controller.js',
'app/controllers/config.dialog.controller.js',
'app/directives/archetypeproperty.js',
'app/directives/archetypesubmitwatcher.js',
'app/directives/archetypecustomview.js',
'app/directives/localize.js',
'app/services/localization.js',
'app/resources/propertyeditor.js'
'app/directives/archetypeLocalize.js',
'app/directives/archetypeclickoutside.js',
'app/services/archetypeLocalizationService.js',
'app/helpers/sampleLabelHelpers.js',
'app/resources/archetypePropertyEditorResource.js',
'app/services/archetypeService.js',
'app/services/archetypeLabelService.js',
'app/services/archetypeCacheService.js'
],
dest: '<%= basePath %>/js/archetype.js'
}
@@ -67,8 +104,24 @@ module.exports = function(grunt) {
copy: {
html: {
cwd: 'app/views/',
src: ['archetype.html', 'archetype.default.html', 'archetype.config.html'],
dest: '<%= basePath %>/views',
src: [
'archetype_versioned.html',
'archetype.default_versioned.html',
'archetype.config_versioned.html',
'archetype.config.fieldset.dialog_versioned.html',
'archetype.config.stylescript.dialog_versioned.html',
'archetype.config.developer.dialog_versioned.html'
],
dest: '<%= basePath %>/views/',
expand: true,
rename: function(dest, src) {
return dest + src.replace('_versioned','');
}
},
assets: {
cwd: 'assets/',
src: ['*.*'],
dest: '<%= basePath %>/assets',
expand: true
},
dll: {
@@ -98,7 +151,13 @@ module.exports = function(grunt) {
{
cwd: '<%= dest %>/bin',
src: ['*.dll'],
dest: 'tmp/nuget/lib/net40',
dest: 'tmp/nuget_binaries/lib/net40',
expand: true
},
{
cwd: 'app/Umbraco/Archetype.Courier/bin/Release/',
src: ['Archetype.Courier.dll'],
dest: 'tmp/nuget_courier/lib/net40',
expand: true
}
]
@@ -112,60 +171,118 @@ module.exports = function(grunt) {
},
nugetpack: {
dist: {
src: 'tmp/nuget/package.nuspec',
dest: 'pkg'
}
dist: {
src: 'tmp/nuget/package.nuspec',
dest: 'pkg'
},
dist_binaries: {
src: 'tmp/nuget_binaries/package_binaries.nuspec',
dest: 'pkg'
},
dist_courier: {
src: 'tmp/nuget_courier/package_courier.nuspec',
dest: 'pkg'
}
},
template: {
'nuspec': {
'options': {
'data': {
name: '<%= pkgMeta.name %>',
version: '<%= pkgMeta.version %>',
url: '<%= pkgMeta.url %>',
license: '<%= pkgMeta.license %>',
licenseUrl: '<%= pkgMeta.licenseUrl %>',
author: '<%= pkgMeta.author %>',
authorUrl: '<%= pkgMeta.authorUrl %>',
files: [{ path: 'tmp/nuget/**', target: 'content/App_Plugins/Archetype'}]
}
},
'files': {
'tmp/nuget/package.nuspec': ['config/package.nuspec']
}
}
'nuspec': {
'options': {
'data': {
name: '<%= pkgMeta.name %>',
version: '<%= pkgMeta.version %>',
url: '<%= pkgMeta.url %>',
license: '<%= pkgMeta.license %>',
licenseUrl: '<%= pkgMeta.licenseUrl %>',
author: '<%= pkgMeta.author %>',
authorUrl: '<%= pkgMeta.authorUrl %>'
}
},
'files': {
'tmp/nuget/package.nuspec': ['config/package.nuspec']
}
},
'nuspec_binaries': {
'options': {
'data': {
name: '<%= pkgMeta.name %>.Binaries',
version: '<%= pkgMeta.version %>',
url: '<%= pkgMeta.url %>',
license: '<%= pkgMeta.license %>',
licenseUrl: '<%= pkgMeta.licenseUrl %>',
author: '<%= pkgMeta.author %>',
authorUrl: '<%= pkgMeta.authorUrl %>'
}
},
'files': {
'tmp/nuget_binaries/package_binaries.nuspec': ['config/package_binaries.nuspec']
}
},
'nuspec_courier': {
'options': {
'data': {
name: '<%= pkgMeta.name %>.Courier',
version: '<%= pkgMeta.version %>',
url: '<%= pkgMeta.url %>',
license: '<%= pkgMeta.license %>',
licenseUrl: '<%= pkgMeta.licenseUrl %>',
author: '<%= pkgMeta.author %>',
authorUrl: '<%= pkgMeta.authorUrl %>'
}
},
'files': {
'tmp/nuget_courier/package_courier.nuspec': ['config/package_courier.nuspec']
}
}
},
umbracoPackage: {
options: {
name: "<%= pkgMeta.name %>",
version: '<%= pkgMeta.version %>',
url: '<%= pkgMeta.url %>',
license: '<%= pkgMeta.license %>',
licenseUrl: '<%= pkgMeta.licenseUrl %>',
author: '<%= pkgMeta.author %>',
authorUrl: '<%= pkgMeta.authorUrl %>',
manifest: 'config/package.xml',
readme: 'config/readme.txt',
sourceDir: 'tmp/umbraco',
outputDir: 'pkg',
dist: {
src: 'tmp/umbraco',
dest: 'pkg',
options: {
name: "<%= pkgMeta.name %>",
version: '<%= pkgMeta.version %>',
url: '<%= pkgMeta.url %>',
license: '<%= pkgMeta.license %>',
licenseUrl: '<%= pkgMeta.licenseUrl %>',
author: '<%= pkgMeta.author %>',
authorUrl: '<%= pkgMeta.authorUrl %>',
readme: '<%= grunt.file.read("config/readme.txt") %>'
}
}
},
clean: {
build: '<%= grunt.config("basePath").substring(0, 4) == "dist" ? "dist/**/*" : "null" %>',
tmp: ['tmp']
tmp: ['tmp'],
html: [
'app/views/*.html',
'!app/views/archetype.html',
'!app/views/archetype.default.html',
'!app/views/archetype.config.html',
'!app/views/archetype.config.fieldset.dialog.html',
'!app/views/archetype.config.stylescript.dialog.html',
'!app/views/archetype.config.developer.dialog.html'
],
js: [
'app/controllers/*.js',
'!app/controllers/controller.js',
'!app/controllers/config.controller.js',
'!app/controllers/config.dialog.controller.js'
],
less: [
'app/less/*.less',
'!app/less/archetype.less'
]
},
assemblyinfo: {
options: {
files: ['app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj'],
files: ['app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj', 'app/Umbraco/Archetype.Courier/Archetype.Courier.csproj'],
filename: 'VersionInfo.cs',
info: {
version: '<%= (pkgMeta.version.indexOf("-") ? pkgMeta.version.substring(0, pkgMeta.version.indexOf("-")) : pkgMeta.version) %>',
version: '<%= (pkgMeta.version.indexOf("-") > 0 ? pkgMeta.version.substring(0, pkgMeta.version.indexOf("-")) : pkgMeta.version) %>',
fileVersion: '<%= pkgMeta.version %>'
}
}
@@ -177,40 +294,29 @@ module.exports = function(grunt) {
}
},
jshint: {
options: {
jshintrc: '.jshintrc'
},
src: {
src: ['app/**/*.js', 'lib/**/*.js']
}
},
msbuild: {
options: {
stdout: true,
verbosity: 'quiet',
maxCpuCount: 4,
version: 4.0,
version: 4.0,
buildParameters: {
WarningLevel: 2,
NoWarn: 1607
}
},
dist: {
src: ['app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj'],
src: ['app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj','app/Umbraco/Archetype.Courier/Archetype.Courier.csproj'],
options: {
projectConfiguration: 'Release',
targets: ['Clean', 'Rebuild'],
}
}
}
});
grunt.registerTask('default', ['clean', 'less', 'concat', 'assemblyinfo', 'msbuild:dist', 'copy:dll', 'copy:config', 'copy:html']);
grunt.registerTask('nuget', ['clean:tmp', 'default', 'copy:nuget', 'template:nuspec', 'nugetpack', 'clean:tmp']);
grunt.registerTask('umbraco', ['clean:tmp', 'default', 'copy:umbraco', 'umbracoPackage', 'clean:tmp']);
grunt.registerTask('package', ['clean:tmp', 'default', 'copy:nuget', 'template:nuspec', 'nugetpack', 'copy:umbraco', 'umbracoPackage', 'clean:tmp']);
grunt.registerTask('default', ['clean', 'string-replace', 'less', 'concat', 'assemblyinfo', 'msbuild:dist', 'copy:dll', 'copy:assets', 'copy:html', 'copy:config', 'clean:html', 'clean:js', 'clean:less']);
grunt.registerTask('nuget', ['copy:nuget', 'template:nuspec', 'template:nuspec_binaries', 'template:nuspec_courier', 'nugetpack']);
grunt.registerTask('umbraco', ['copy:umbraco', 'umbracoPackage']);
grunt.registerTask('package', ['clean:tmp', 'default', 'nuget', 'copy:umbraco', 'umbracoPackage', 'clean:tmp']);
};
+10 -2
View File
@@ -7,12 +7,20 @@ Archetype
## Installation
Install the selected <a href='https://github.com/imulus/Archetype/releases'>release</a> through the Umbraco package installer or via <a href='http://www.nuget.org/packages/Archetype/'>NuGet</a>.
## Official Docs ##
http://imulus.github.io/Archetype
https://github.com/kgiszewski/ArchetypeManual
##News and Updates##
Follow us on Twitter https://twitter.com/ArchetypeKit
##Core Team##
* Kevin Giszewski (founder/project lead) - University of Notre Dame - https://kevin.giszewski.com/
* Tom Fulton (founder) - Tonic - http://hellotonic.com/
* Lee Kelleher - Umbrella - http://www.umbrellainc.co.uk/
* Matt Brailsford - The Outfield - http://www.theoutfield.co.uk/
* Kenn Jacobsen - Vertica - http://kennjacobsen.dk/
## Contribute ##
Want to contribute to Archetype? You'll want to use Grunt (our task runner) to help you integrate with a local copy of Umbraco.
@@ -1,19 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Archetype.Extensions;
using Archetype.Models;
using Archetype.PropertyConverters;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Courier.Core;
using Umbraco.Courier.Core.Logging;
using Umbraco.Courier.Core.ProviderModel;
using Umbraco.Courier.DataResolvers;
using Umbraco.Courier.ItemProviders;
namespace Archetype.Courier.DataResolvers
{
/// <summary>
/// Lee Kelleher's implementation of Courier's PropertyDataResolverProvider for Archetype.
/// </summary>
public class ArchetypeDataResolver : PropertyDataResolverProvider
{
private enum Direction
@@ -22,40 +24,68 @@ namespace Archetype.Courier.DataResolvers
Packaging
}
/// <summary>
/// Gets the editor alias.
/// </summary>
/// <value>
/// The editor alias.
/// </value>
public override string EditorAlias
{
get
{
return Archetype.Constants.PropertyEditorAlias;
return Constants.PropertyEditorAlias;
}
}
/// <summary>
/// Extractings the type of the data.
/// </summary>
/// <param name="item">The item.</param>
public override void ExtractingDataType(DataType item)
{
// No longer need to extract the DataType (int) Ids as they now reference the Guid [LK]
// No longer need to extract the DataType (int) Ids as Archetype now references the Guid [LK]
}
/// <summary>
/// Extractings the property.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="propertyData">The property data.</param>
public override void ExtractingProperty(Item item, ContentProperty propertyData)
{
ReplacePropertyDataIds(item, propertyData, Direction.Extracting);
}
/// <summary>
/// Packagings the type of the data.
/// </summary>
/// <param name="item">The item.</param>
public override void PackagingDataType(DataType item)
{
AddDataTypeDependencies(item);
}
/// <summary>
/// Packages the property.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="propertyData">The property data.</param>
public override void PackagingProperty(Item item, ContentProperty propertyData)
{
ReplacePropertyDataIds(item, propertyData, Direction.Packaging);
}
/// <summary>
/// Adds the datatype dependencies.
/// </summary>
/// <param name="item">The item.</param>
private void AddDataTypeDependencies(DataType item)
{
if (item.Prevalues != null && item.Prevalues.Count > 0)
{
var prevalue = item.Prevalues[0];
if (prevalue.Alias.InvariantEquals(Archetype.Constants.PreValueAlias) && !string.IsNullOrWhiteSpace(prevalue.Value))
if (prevalue.Alias.InvariantEquals(Constants.PreValueAlias) && !string.IsNullOrWhiteSpace(prevalue.Value))
{
var config = JsonConvert.DeserializeObject<ArchetypePreValue>(prevalue.Value);
@@ -63,7 +93,7 @@ namespace Archetype.Courier.DataResolvers
{
foreach (var property in config.Fieldsets.SelectMany(x => x.Properties))
{
item.Dependencies.Add(property.DataTypeGuid.ToString(), ProviderIDCollection.dataTypeItemProviderGuid);
item.Dependencies.Add(property.DataTypeGuid.ToString(), ItemProviderIds.dataTypeItemProviderGuid);
}
item.Prevalues[0].Value = JsonConvert.SerializeObject(config, Formatting.None);
@@ -72,21 +102,36 @@ namespace Archetype.Courier.DataResolvers
}
}
/// <summary>
/// Replaces the property data Ids.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="propertyData">The property data.</param>
/// <param name="direction">The direction.</param>
private void ReplacePropertyDataIds(Item item, ContentProperty propertyData, Direction direction)
{
if (propertyData != null && propertyData.Value != null)
{
// just look at the amount of dancing around we have to do in order to fake a `PublishedPropertyType`?!
var dataTypeId = PersistenceManager.Default.GetNodeId(propertyData.DataType, NodeObjectTypes.DataType);
var fakePropertyType = this.CreateDummyPropertyType(dataTypeId, this.EditorAlias);
var dataType = ExecutionContext.DatabasePersistence.RetrieveItem<DataType>(new ItemIdentifier(propertyData.DataType.ToString(),
ItemProviderIds.dataTypeItemProviderGuid));
var converter = new ArchetypeValueConverter();
var archetype = (ArchetypeModel)converter.ConvertDataToSource(fakePropertyType, propertyData.Value, false);
//Fetch the Prevalues for the current Property's DataType (if its an 'Archetype config')
var prevalue = dataType.Prevalues.FirstOrDefault(x => x.Alias.ToLowerInvariant().Equals("archetypeconfig"));
var archetypePreValue = prevalue == null
? null
: JsonConvert.DeserializeObject<ArchetypePreValue>(prevalue.Value,
ArchetypeHelper.Instance.JsonSerializerSettings);
RetrieveAdditionalProperties(ref archetypePreValue);
//Deserialize the value of the current Property to an ArchetypeModel and set additional properties before converting values
var sourceJson = propertyData.Value.ToString();
var archetype = JsonConvert.DeserializeObject<ArchetypeModel>(sourceJson, ArchetypeHelper.Instance.JsonSerializerSettings);
RetrieveAdditionalProperties(ref archetype, archetypePreValue);
if (archetype != null)
{
// create a 'fake' provider, as ultimately only the 'Packaging' enum will be referenced.
var fakeItemProvider = new PropertyItemProvider();
// get the `PropertyItemProvider` from the collection.
var propertyItemProvider = ItemProviderCollection.Instance.GetProvider(ItemProviderIds.propertyDataItemProviderGuid, ExecutionContext);
foreach (var property in archetype.Fieldsets.SelectMany(x => x.Properties))
{
@@ -94,16 +139,16 @@ namespace Archetype.Courier.DataResolvers
continue;
// create a 'fake' item for Courier to process
var fakeItem = new ContentPropertyData()
var fakeItem = new ContentPropertyData
{
ItemId = item.ItemId,
Name = string.Format("{0} [{1}: Nested {2} ({3})]", new[] { item.Name, this.EditorAlias, property.PropertyEditorAlias, property.Alias }),
Name = string.Format("{0} [{1}: Nested {2} ({3})]", new[] { item.Name, EditorAlias, property.PropertyEditorAlias, property.Alias }),
Data = new List<ContentProperty>
{
new ContentProperty
{
Alias = property.Alias,
DataType = PersistenceManager.Default.GetUniqueId(property.DataTypeId, NodeObjectTypes.DataType),
DataType = ExecutionContext.DatabasePersistence.GetUniqueId(property.DataTypeId, UmbracoNodeObjectTypeIds.DataType),
PropertyEditorAlias = property.PropertyEditorAlias,
Value = property.Value
}
@@ -115,11 +160,11 @@ namespace Archetype.Courier.DataResolvers
try
{
// run the 'fake' item through Courier's data resolvers
ResolutionManager.Instance.PackagingItem(fakeItem, fakeItemProvider);
ResolutionManager.Instance.PackagingItem(fakeItem, propertyItemProvider);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypeDataResolver>(string.Concat("Error packaging data value: ", fakeItem.Name), ex);
CourierLogHelper.Error<ArchetypeDataResolver>(string.Concat("Error packaging data value: ", fakeItem.Name), ex);
}
// pass up the dependencies and resources
@@ -131,11 +176,11 @@ namespace Archetype.Courier.DataResolvers
try
{
// run the 'fake' item through Courier's data resolvers
ResolutionManager.Instance.ExtractingItem(fakeItem, fakeItemProvider);
ResolutionManager.Instance.ExtractingItem(fakeItem, propertyItemProvider);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypeDataResolver>(string.Concat("Error extracting data value: ", fakeItem.Name), ex);
CourierLogHelper.Error<ArchetypeDataResolver>(string.Concat("Error extracting data value: ", fakeItem.Name), ex);
}
}
@@ -149,28 +194,67 @@ namespace Archetype.Courier.DataResolvers
// (if packaging) add a dependency for the property's data-type
if (direction == Direction.Packaging)
item.Dependencies.Add(firstDataType.DataType.ToString(), ProviderIDCollection.dataTypeItemProviderGuid);
item.Dependencies.Add(firstDataType.DataType.ToString(), ItemProviderIds.dataTypeItemProviderGuid);
}
}
}
if (item.Name.Contains(string.Concat(this.EditorAlias, ": Nested")))
{
// if the Archetype is nested, then we only want to return the object itself - not a serialized string
propertyData.Value = archetype;
}
else
{
// if the Archetype is the root/container, then we can serialize it to a string
propertyData.Value = archetype.SerializeForPersistence();
}
// serialize the Archetype back to a string
propertyData.Value = archetype.SerializeForPersistence();
}
}
}
private PublishedPropertyType CreateDummyPropertyType(int dataTypeId, string propertyEditorAlias)
/// <summary>
/// Retrieves the additional properties.
/// </summary>
/// <param name="preValue">The pre value.</param>
private void RetrieveAdditionalProperties(ref ArchetypePreValue preValue)
{
return new PublishedPropertyType(null, new PropertyType(new DataTypeDefinition(-1, propertyEditorAlias) { Id = dataTypeId }));
if (preValue == null)
return;
foreach (var fieldset in preValue.Fieldsets)
{
foreach (var property in fieldset.Properties)
{
var dataType = ExecutionContext.DatabasePersistence.RetrieveItem<DataType>(
new ItemIdentifier(property.DataTypeGuid.ToString(),
ItemProviderIds.dataTypeItemProviderGuid));
if (dataType == null)
continue;
property.PropertyEditorAlias = dataType.PropertyEditorAlias;
}
}
}
/// <summary>
/// Retrieves the additional properties.
/// </summary>
/// <param name="archetype">The archetype.</param>
/// <param name="preValue">The pre value.</param>
private void RetrieveAdditionalProperties(ref ArchetypeModel archetype, ArchetypePreValue preValue)
{
foreach (var fieldset in preValue.Fieldsets)
{
var fieldsetAlias = fieldset.Alias;
foreach (var fieldsetInst in archetype.Fieldsets.Where(x => x.Alias == fieldsetAlias))
{
foreach (var property in fieldset.Properties)
{
var propertyAlias = property.Alias;
foreach (var propertyInst in fieldsetInst.Properties.Where(x => x.Alias == propertyAlias))
{
propertyInst.DataTypeGuid = property.DataTypeGuid.ToString();
propertyInst.DataTypeId = ExecutionContext.DatabasePersistence.GetNodeId(
property.DataTypeGuid, UmbracoNodeObjectTypeIds.DataType);
propertyInst.PropertyEditorAlias = property.PropertyEditorAlias;
}
}
}
}
}
}
}
@@ -33,67 +33,85 @@
<ItemGroup>
<Reference Include="AutoMapper">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="AutoMapper.Net4">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="businesslogic, Version=1.0.5242.22740, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ClientDependency.Core">
<HintPath>..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ClientDependency.Core.Mvc">
<HintPath>..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="cms, Version=1.0.5242.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="controls, Version=1.0.5242.22742, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="CookComputing.XmlRpcV2">
<HintPath>..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Examine, Version=0.1.55.2941, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="HtmlAgilityPack">
<HintPath>..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ImageProcessor, Version=1.9.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ImageProcessor.Web, Version=3.2.3.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="interfaces, Version=1.0.5242.22737, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Lucene.Net">
<HintPath>..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data, Version=1.0.1559.20655, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
@@ -101,26 +119,33 @@
</Reference>
<Reference Include="Microsoft.Web.Mvc.FixedDisplayModes">
<HintPath>..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="MiniProfiler">
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Moq">
<HintPath>..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
<Reference Include="nunit.framework, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SQLCE4Umbraco, Version=1.0.5242.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -135,17 +160,21 @@
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
@@ -176,52 +205,64 @@
<Reference Include="TidyNet, Version=1.0.0.0, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco, Version=1.0.5242.22743, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Umbraco.Core, Version=1.0.5242.22738, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.DataLayer, Version=1.0.5242.22740, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.editorControls, Version=1.0.5242.22746, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.MacroEngines, Version=1.0.5242.22747, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.providers, Version=1.0.5242.22742, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Umbraco.Web.UI, Version=1.0.5242.22748, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.XmlSerializers, Version=1.0.5242.22743, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="UmbracoExamine, Version=0.6.0.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter, Version=2.0.60829.1, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Models\FieldsetTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="PropertyValueConverter\PropertyValueConverterTests.cs" />
<Compile Include="PublishedContent\ArchetypePublishedContentTests.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
@@ -232,9 +273,12 @@
<ProjectReference Include="..\Umbraco.Archetype\Archetype.Umbraco.csproj">
<Project>{7D185D41-4228-4978-ACB8-83F9A48AD94F}</Project>
<Name>Archetype.Umbraco</Name>
<Private>True</Private>
</ProjectReference>
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<PropertyGroup>
@@ -1,21 +1,21 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Archetype.PropertyConverters;
using NUnit.Framework;
namespace Archetype.Tests.Models
{
/// <summary>
/// Tests designed for the fieldsets.
/// </summary>
[TestFixture]
public class FieldsetTests
{
private string _sampleJson;
/// <summary>
/// Sets up the test to use sample JSON data.
/// </summary>
[SetUp]
public void SetUp()
{
@@ -1,22 +1,21 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Archetype.PropertyConverters;
using Moq;
using NUnit.Framework;
using Umbraco.Core.Models.PublishedContent;
namespace Archetype.Tests.PropertyValueConverter
{
/// <summary>
/// Tests designed to test the PVC.
/// </summary>
[TestFixture]
public class PropertyValueConverterTests
{
private string _sampleJson;
/// <summary>
/// Sets up the test to use JSON data.
/// </summary>
[SetUp]
public void SetUp()
{
@@ -0,0 +1,156 @@
using System;
using System.Linq;
using Archetype.Extensions;
using Archetype.Models;
using Archetype.PropertyConverters;
using NUnit.Framework;
using Umbraco.Core.Models;
using Umbraco.Web;
namespace Archetype.Tests.PublishedContent
{
[TestFixture]
public class ArchetypePublishedContentTests
{
private ArchetypeModel _archetype;
[TestFixtureSetUp]
public void Init()
{
var archetypeJson = System.IO.File.ReadAllText("..\\..\\Data\\sample-1.json");
var converter = new ArchetypeValueConverter();
_archetype = (ArchetypeModel)converter.ConvertDataToSource(null, archetypeJson, false);
}
[Test]
public void ArchetypeModel_Initialized()
{
Assert.IsNotNull(_archetype);
Assert.IsNotEmpty(_archetype.Fieldsets);
}
[Test]
public void ArchetypeModel_To_PublishedContentSet()
{
var contentSet = _archetype.ToPublishedContentSet();
Assert.That(contentSet, Is.Not.Null);
Assert.That(contentSet, Is.Not.Empty);
Assert.That(contentSet, Is.All.InstanceOf<IPublishedContent>());
}
[Test]
public void ArchetypeFieldsetModel_To_PublishedContent()
{
var fieldset = _archetype.Fieldsets.FirstOrDefault();
var content = fieldset.ToPublishedContent();
Assert.That(content, Is.Not.Null);
Assert.That(content, Is.InstanceOf<IPublishedContent>());
Assert.That(content.Properties, Is.Not.Empty);
Assert.That(content.Properties, Is.All.InstanceOf<IPublishedProperty>());
}
[TestCase("boxHeadline", "Box 1 Title")]
[TestCase("link", "3175")]
[TestCase("link", 3175)]
[TestCase("show", "1")]
[TestCase("show", true)]
[TestCase("show", 1)]
public void ArchetypePublishedContent_Typed_Properties<T>(string propertyAlias, T expected)
{
var fieldset = _archetype.Fieldsets.FirstOrDefault();
var content = fieldset.ToPublishedContent();
var actual = content.GetPropertyValue<T>(propertyAlias);
Assert.AreEqual(actual, expected);
}
[Test]
public void Null_ArchetypeModel_Throws_Exception()
{
TestDelegate code = () =>
{
ArchetypeModel archetype = null;
archetype.ToPublishedContentSet();
};
Assert.Throws<ArgumentNullException>(code);
}
[Test]
public void Null_ArchetypeFieldsetModel_Throws_Exception()
{
TestDelegate code = () =>
{
ArchetypeFieldsetModel fieldset = null;
fieldset.ToPublishedContent();
};
Assert.Throws<ArgumentNullException>(code);
}
[Test]
public void ArchetypePublishedContent_GetIndex()
{
var contentSet = _archetype.ToPublishedContentSet();
var i = 0;
foreach (var content in contentSet)
{
Assert.AreEqual(content.GetIndex(), i);
i++;
}
}
[Test]
public void ArchetypePublishedContentSet_IsFirstIsLast()
{
var contentSet = _archetype.ToPublishedContentSet();
foreach (var content in contentSet)
{
var value = content.GetPropertyValue<string>("boxHeadline");
Assert.That(value == "Box 1 Title", Is.EqualTo(content.IsFirst()));
Assert.That(value == "Another Box", Is.EqualTo(content.IsLast()));
}
}
[Test]
public void ArchetypePublishedContentSet_PreviousNext()
{
var contentSet = _archetype.ToPublishedContentSet();
var list = contentSet.ToList();
Assert.That(list.Count, Is.EqualTo(2));
var first = list[0];
var last = list[1];
var next = first.Next();
Assert.AreEqual(next, last);
var prev = last.Previous();
Assert.AreEqual(prev, first);
}
[Test, ExpectedException(typeof(NullReferenceException))]
public void ArchetypePublishedContentSet_Siblings()
{
var contentSet = _archetype.ToPublishedContentSet();
var content = contentSet.FirstOrDefault();
var siblings = content.Siblings();
Assert.That(siblings, Is.Not.Null);
var following = content.FollowingSibling();
Assert.That(following, Is.Not.Null);
var preceding = content.PrecedingSibling();
Assert.That(preceding, Is.Not.Null);
}
}
}
+1 -1
View File
@@ -21,7 +21,7 @@
<package id="Moq" version="4.2.1312.1622" targetFramework="net45" />
<package id="MySql.Data" version="6.6.5" targetFramework="net45" />
<package id="Newtonsoft.Json" version="6.0.2" targetFramework="net45" />
<package id="NUnit" version="2.6.3" targetFramework="net45" />
<package id="NUnit" version="2.6.4" targetFramework="net45" />
<package id="SharpZipLib" version="0.86.0" targetFramework="net45" />
<package id="UmbracoCms.Core" version="7.1.2" targetFramework="net45" />
<package id="xmlrpcnet" version="2.5.0" targetFramework="net45" />
-49
View File
@@ -1,49 +0,0 @@
using System;
using Umbraco.Core;
using Umbraco.Core.Logging;
namespace DatabaseSizer
{
public class Application : ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
base.ApplicationStarted(umbracoApplication, applicationContext);
ExpandPrevalueValueColumnSize();
}
protected void ExpandPrevalueValueColumnSize()
{
try
{
var dbContext = ApplicationContext.Current.DatabaseContext;
var colCount =
dbContext.Database.ExecuteScalar<int>(
"SELECT COUNT(1) FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE = 'nvarchar' AND COLUMN_NAME = 'value' AND CHARACTER_MAXIMUM_LENGTH = 2500 AND TABLE_NAME = 'cmsDataTypePreValues'");
// Check column
if (colCount != 0)
{
using (var trans = dbContext.Database.GetTransaction())
{
// Change column
dbContext.Database.Execute("ALTER TABLE [cmsDataTypePreValues] ALTER COLUMN [value] ntext NULL;");
trans.Complete();
}
LogHelper.Debug(typeof(Application), "Successfully expanded Prevalue table Value column");
}
else
{
LogHelper.Debug(typeof(Application), "Prevalue table Value column is already expanded");
}
}
catch (Exception ex)
{
LogHelper.Error(typeof(Application), "Error expanding Prevalue table Value column", ex);
}
}
}
}
@@ -1,213 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{0114C963-C514-49C1-B7AB-DCB1825F498C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DatabaseSizer</RootNamespace>
<AssemblyName>DatabaseSizer</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
</Reference>
<Reference Include="AutoMapper.Net4">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
</Reference>
<Reference Include="businesslogic">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll</HintPath>
</Reference>
<Reference Include="ClientDependency.Core">
<HintPath>..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll</HintPath>
</Reference>
<Reference Include="ClientDependency.Core.Mvc">
<HintPath>..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll</HintPath>
</Reference>
<Reference Include="cms">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
</Reference>
<Reference Include="controls">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll</HintPath>
</Reference>
<Reference Include="CookComputing.XmlRpcV2">
<HintPath>..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll</HintPath>
</Reference>
<Reference Include="Examine">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll</HintPath>
</Reference>
<Reference Include="HtmlAgilityPack">
<HintPath>..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll</HintPath>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="ImageProcessor">
<HintPath>..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll</HintPath>
</Reference>
<Reference Include="ImageProcessor.Web">
<HintPath>..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll</HintPath>
</Reference>
<Reference Include="interfaces">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll</HintPath>
</Reference>
<Reference Include="Lucene.Net">
<HintPath>..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Helpers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Mvc.FixedDisplayModes">
<HintPath>..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.0\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll</HintPath>
</Reference>
<Reference Include="MiniProfiler">
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="SQLCE4Umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll</HintPath>
</Reference>
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Core.4.0.20710.0\lib\net40\System.Web.Http.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.20710.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
</Reference>
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.2.0.20710.0\lib\net40\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Deployment.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="TidyNet">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
</Reference>
<Reference Include="umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Core">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll</HintPath>
</Reference>
<Reference Include="umbraco.DataLayer">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll</HintPath>
</Reference>
<Reference Include="umbraco.editorControls">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll</HintPath>
</Reference>
<Reference Include="umbraco.MacroEngines">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll</HintPath>
</Reference>
<Reference Include="umbraco.providers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Web.UI">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll</HintPath>
</Reference>
<Reference Include="umbraco.XmlSerializers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll</HintPath>
</Reference>
<Reference Include="UmbracoExamine">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll</HintPath>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Application.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -1,36 +0,0 @@
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("DatabaseSizer.cs")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DatabaseSizer.cs")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[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("28dc35d2-3dfb-40b4-9093-bc47c91127ea")]
// 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 Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
-27
View File
@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
-25
View File
@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AutoMapper" version="3.0.0" targetFramework="net45" />
<package id="ClientDependency" version="1.7.1.2" targetFramework="net45" />
<package id="ClientDependency-Mvc" version="1.7.0.4" targetFramework="net45" />
<package id="HtmlAgilityPack" version="1.4.6" targetFramework="net45" />
<package id="ImageProcessor" version="1.9.0.0" targetFramework="net45" />
<package id="ImageProcessor.Web" version="3.2.3.0" targetFramework="net45" />
<package id="Lucene.Net" version="2.9.4.1" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="2.0.20710.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi" version="4.0.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="4.0.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="4.0.20710.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.20710.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="2.0.20710.0" targetFramework="net45" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="MiniProfiler" version="2.1.0" targetFramework="net45" />
<package id="MySql.Data" version="6.6.5" targetFramework="net45" />
<package id="Newtonsoft.Json" version="6.0.2" targetFramework="net45" />
<package id="SharpZipLib" version="0.86.0" targetFramework="net45" />
<package id="UmbracoCms.Core" version="7.1.2" targetFramework="net45" />
<package id="xmlrpcnet" version="2.5.0" targetFramework="net45" />
</packages>
+3 -7
View File
@@ -1,6 +1,8 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
# Visual Studio 2013
VisualStudioVersion = 12.0.40629.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Umbraco", "Umbraco.Archetype\Archetype.Umbraco.csproj", "{7D185D41-4228-4978-ACB8-83F9A48AD94F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D84AA4ED-85A6-484F-9E72-BE7AC9835821}"
@@ -12,8 +14,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D84AA4
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Tests", "Archetype.Tests\Archetype.Tests.csproj", "{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DatabaseSizer", "DatabaseSizer\DatabaseSizer.csproj", "{0114C963-C514-49C1-B7AB-DCB1825F498C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Courier", "Archetype.Courier\Archetype.Courier.csproj", "{FE8BE437-8B11-4E49-9B02-F45994E6D723}"
EndProject
Global
@@ -30,10 +30,6 @@ Global
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.Build.0 = Release|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.Build.0 = Release|Any CPU
{FE8BE437-8B11-4E49-9B02-F45994E6D723}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE8BE437-8B11-4E49-9B02-F45994E6D723}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FE8BE437-8B11-4E49-9B02-F45994E6D723}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -1,33 +1,48 @@
using System.Collections.Generic;
using System;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Web.Http;
using AutoMapper;
using Umbraco.Core.Models;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Web.Mvc;
using Umbraco.Web.Editors;
using Archetype.Extensions;
namespace Archetype.Api
{
/// <summary>
/// Controller that handles datatype related interactions.
/// </summary>
[PluginController("ArchetypeApi")]
public class ArchetypeDataTypeController : UmbracoAuthorizedJsonController
{
public IEnumerable<object> GetAllPropertyEditors()
{
return
global::Umbraco.Core.PropertyEditors.PropertyEditorResolver.Current.PropertyEditors
.Select(x => new {defaultPreValues = x.DefaultPreValues, alias = x.Alias, view = x.ValueEditor.View});
.Select(x => new {defaultPreValues = x.DefaultPreValuesForArchetype(), alias = x.Alias, view = x.ValueEditor.View});
}
/// <summary>
/// Gets all datatypes.
/// </summary>
/// <returns></returns>
public object GetAll()
{
var dataTypes = Services.DataTypeService.GetAllDataTypeDefinitions();
return dataTypes.Select(t => new { guid = t.Key, name = t.Name });
}
/// <summary>
/// Gets the datatype by GUID.
/// </summary>
/// <param name="guid">The unique identifier.</param>
/// <returns></returns>
/// <exception cref="System.Web.Http.HttpResponseException"></exception>
public object GetByGuid(Guid guid)
{
var dataType = Services.DataTypeService.GetDataTypeDefinitionById(guid);
@@ -35,8 +50,51 @@ namespace Archetype.Api
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
var dataTypeDisplay = Mapper.Map<IDataTypeDefinition, DataTypeDisplay>(dataType);
return new { selectedEditor = dataTypeDisplay.SelectedEditor, preValues = dataTypeDisplay.PreValues };
}
/// <summary>
/// Gets the datatype by GUID.
/// </summary>
/// <param name="guid">The unique identifier.</param>
/// <param name="contentTypeAlias">The content type alias.</param>
/// <param name="propertyTypeAlias">The property type alias.</param>
/// <param name="archetypeAlias">The archetype alias.</param>
/// <param name="nodeId">The node identifier.</param>
/// <returns></returns>
/// <exception cref="System.Web.Http.HttpResponseException"></exception>
public object GetByGuid(Guid guid, string contentTypeAlias, string propertyTypeAlias, string archetypeAlias, int nodeId)
{
var dataType = Services.DataTypeService.GetDataTypeDefinitionById(guid);
if (dataType == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
var dataTypeDisplay = Mapper.Map<IDataTypeDefinition, DataTypeDisplay>(dataType);
return new { selectedEditor = dataTypeDisplay.SelectedEditor, preValues = dataTypeDisplay.PreValues, contentTypeAlias = contentTypeAlias, propertyTypeAlias = propertyTypeAlias, archetypeAlias = archetypeAlias, nodeId = nodeId };
}
/// <summary>
/// Returns the DLL version from the file.
/// </summary>
/// <returns></returns>
public object GetDllVersion()
{
return new {dllVersion = _version()};
}
/// <summary>
/// Gets the DLL version from the file.
/// </summary>
/// <returns></returns>
private string _version()
{
var asm = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(asm.Location);
return fvi.FileVersion;
}
}
}
@@ -231,16 +231,23 @@
<Compile Include="Api\ArchetypeDataTypeController.cs" />
<Compile Include="Constants.cs" />
<Compile Include="Events\ExpireCache.cs" />
<Compile Include="Extensions\ArchetypeFieldsetModelExtensions.cs" />
<Compile Include="Extensions\ArchetypeHelper.cs" />
<Compile Include="Extensions\ArchetypeModelExtensions.cs" />
<Compile Include="Extensions\HtmlHelperExtensions.cs" />
<Compile Include="Extensions\ArchetypePropertyModelExtensions.cs" />
<Compile Include="Extensions\PropertyEditorExtensions.cs" />
<Compile Include="Extensions\StringExtensions.cs" />
<Compile Include="Models\ArchetypeModel.cs" />
<Compile Include="Models\ArchetypePreValue.cs" />
<Compile Include="Models\ArchetypePreValueFieldset.cs" />
<Compile Include="Models\ArchetypePreValueFieldsetGroup.cs" />
<Compile Include="Models\ArchetypePreValueProperty.cs" />
<Compile Include="Models\ArchetypeFieldsetModel.cs" />
<Compile Include="Models\ArchetypePropertyModel.cs" />
<Compile Include="Models\ArchetypePublishedContent.cs" />
<Compile Include="Models\ArchetypePublishedContentSet.cs" />
<Compile Include="Models\ArchetypePublishedProperty.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\VersionInfo.cs" />
<Compile Include="PropertyConverters\ArchetypeValueConverter.cs" />
@@ -1,5 +1,8 @@
namespace Archetype
{
/// <summary>
/// Archetype constants.
/// </summary>
public static class Constants
{
public const string PropertyEditorAlias = "Imulus.Archetype";
@@ -1,18 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Core;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Web;
namespace Archetype.Events
{
public class ExpireCache : ApplicationEventHandler
{
/// <summary>
/// Registers our ExpirePreValueCache handler on app starting.
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
protected override void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
base.ApplicationStarting(umbracoApplication, applicationContext);
@@ -20,6 +18,11 @@ namespace Archetype.Events
DataTypeService.Saved += ExpirePreValueCache;
}
/// <summary>
/// Expires the pre value cache when a datatype is saved.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="Umbraco.Core.Events.SaveEventArgs{IDataTypeDefinition}"/> instance containing the event data.</param>
void ExpirePreValueCache(IDataTypeService sender, global::Umbraco.Core.Events.SaveEventArgs<IDataTypeDefinition> e)
{
foreach (var dataType in e.SavedEntities)
@@ -0,0 +1,25 @@
using System.Linq;
using Archetype.Models;
using Umbraco.Core.Models;
namespace Archetype.Extensions
{
public static class ArchetypeFieldsetModelExtensions
{
public static IPublishedContent ToPublishedContent(this ArchetypeFieldsetModel fieldset)
{
return new ArchetypePublishedContent(fieldset);
}
public static IPublishedContent ToPublishedContent(this ArchetypeFieldsetModel fieldset, ArchetypeModel archetype)
{
var contentSet = archetype.ToPublishedContentSet();
var first = contentSet
.Cast<ArchetypePublishedContent>()
.FirstOrDefault(x => x.ArchetypeFieldset == fieldset);
return first ?? new ArchetypePublishedContent(fieldset);
}
}
}
@@ -3,11 +3,15 @@ using System.Linq;
using Archetype.Models;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
namespace Archetype.Extensions
{
/// <summary>
/// Helper class that handles several Archetype related interactions.
/// </summary>
public class ArchetypeHelper
{
protected JsonSerializerSettings _jsonSettings;
@@ -17,6 +21,9 @@ namespace Archetype.Extensions
internal static ArchetypeHelper Instance { get { return _instance; } }
/// <summary>
/// Initializes a new instance of the <see cref="ArchetypeHelper"/> class.
/// </summary>
internal ArchetypeHelper()
{
var dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver();
@@ -26,6 +33,20 @@ namespace Archetype.Extensions
_app = ApplicationContext.Current;
}
/// <summary>
/// Gets the json serializer settings.
/// </summary>
/// <value>
/// The json serializer settings.
/// </value>
internal JsonSerializerSettings JsonSerializerSettings { get { return _jsonSettings; } }
/// <summary>
/// Deserializes the JSON to archetype.
/// </summary>
/// <param name="sourceJson">The source JSON.</param>
/// <param name="dataTypePreValues">The data type pre values.</param>
/// <returns></returns>
internal ArchetypeModel DeserializeJsonToArchetype(string sourceJson, PreValueCollection dataTypePreValues)
{
try
@@ -40,6 +61,7 @@ namespace Archetype.Extensions
}
catch (Exception ex)
{
LogHelper.Error<ArchetypeHelper>("DeserializeJsonToArchetype", ex);
}
return archetype;
@@ -50,6 +72,13 @@ namespace Archetype.Extensions
}
}
/// <summary>
/// Deserializes the JSON to archetype.
/// </summary>
/// <param name="sourceJson">The source JSON.</param>
/// <param name="dataTypeId">The data type identifier.</param>
/// <param name="hostContentType">Type of the host content.</param>
/// <returns></returns>
internal ArchetypeModel DeserializeJsonToArchetype(string sourceJson, int dataTypeId, PublishedContentType hostContentType = null)
{
try
@@ -64,6 +93,7 @@ namespace Archetype.Extensions
}
catch (Exception ex)
{
LogHelper.Error<ArchetypeHelper>(string.Format("DeserializeJsonToArchetype Error DatatypeId=>{0} SourceJson=>{1}", dataTypeId, sourceJson), ex);
}
return archetype;
@@ -74,6 +104,25 @@ namespace Archetype.Extensions
}
}
/// <summary>
/// Determines whether datatypeId has had it's PVC overridden.
/// </summary>
/// <param name="dataTypeId">The data type identifier.</param>
/// <returns></returns>
internal bool IsPropertyValueConverterOverridden(int dataTypeId)
{
var prevalues = GetArchetypePreValueFromDataTypeId(dataTypeId);
if (prevalues == null)
return false;
return prevalues.OverrideDefaultPropertyValueConverter;
}
/// <summary>
/// Gets the archetype pre value from data type identifier.
/// </summary>
/// <param name="dataTypeId">The data type identifier.</param>
/// <returns></returns>
private ArchetypePreValue GetArchetypePreValueFromDataTypeId(int dataTypeId)
{
return _app.ApplicationCache.RuntimeCache.GetCacheItem(
@@ -94,6 +143,11 @@ namespace Archetype.Extensions
}) as ArchetypePreValue;
}
/// <summary>
/// Gets the archetype pre value from pre values collection.
/// </summary>
/// <param name="dataTypePreValues">The data type pre values.</param>
/// <returns></returns>
private ArchetypePreValue GetArchetypePreValueFromPreValuesCollection(PreValueCollection dataTypePreValues)
{
var preValueAsString = dataTypePreValues.PreValuesAsDictionary.First().Value.Value;
@@ -101,7 +155,12 @@ namespace Archetype.Extensions
return preValue;
}
private IDataTypeDefinition GetDataTypeByGuid(Guid guid)
/// <summary>
/// Gets the data type by unique identifier.
/// </summary>
/// <param name="guid">The unique identifier.</param>
/// <returns></returns>
internal IDataTypeDefinition GetDataTypeByGuid(Guid guid)
{
return (IDataTypeDefinition)ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem(
Constants.CacheKey_DataTypeByGuid + guid,
@@ -0,0 +1,14 @@
using System.Collections.Generic;
using Archetype.Models;
using Umbraco.Core.Models;
namespace Archetype.Extensions
{
public static class ArchetypeModelExtensions
{
public static IEnumerable<IPublishedContent> ToPublishedContentSet(this ArchetypeModel archetype)
{
return new ArchetypePublishedContentSet(archetype);
}
}
}
@@ -2,18 +2,37 @@ using Archetype.Models;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
namespace Archetype.Extensions
{
/// <summary>
/// ArchetypePropertyModel extensions.
/// </summary>
public static class ArchetypePropertyModelExtensions
{
/// <summary>
/// Determines whether this instance is an archetype.
/// </summary>
/// <param name="prop">The property.</param>
/// <returns></returns>
public static bool IsArchetype(this ArchetypePropertyModel prop)
{
return prop.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditorAlias);
}
/// <summary>
/// Creates dummy property type.
/// </summary>
/// <param name="prop">The property.</param>
/// <returns></returns>
internal static PublishedPropertyType CreateDummyPropertyType(this ArchetypePropertyModel prop)
{
// We need to check if `PropertyValueConvertersResolver` exists,
// otherwise `PublishedPropertyType` will throw an exception outside of the Umbraco context.; e.g. unit-tests.
if (!PropertyValueConvertersResolver.HasCurrent)
return null;
return new PublishedPropertyType(prop.HostContentType, new PropertyType(new DataTypeDefinition(-1, prop.PropertyEditorAlias) { Id = prop.DataTypeId }));
}
}
@@ -7,60 +7,154 @@ using Umbraco.Core.Logging;
namespace Archetype.Extensions
{
/// <summary>
/// HtmlHelper extenions used for rendering an Archetype.
/// </summary>
public static class HtmlHelperExtensions
{
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel)
/// <summary>
/// Renders the partials based on the model, partial path and given viewdata dictionary.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="archetypeModel">The archetype model.</param>
/// <param name="partialPath">The partial path.</param>
/// <param name="viewDataDictionary">The view data dictionary.</param>
/// <returns></returns>
private static IHtmlString _renderPartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
return RenderPartials(htmlHelper, archetypeModel, null, null);
var sb = new StringBuilder();
foreach (var fieldsetModel in archetypeModel)
{
sb.AppendLine(_renderPartial(htmlHelper, fieldsetModel, partialPath, viewDataDictionary).ToString());
}
return new HtmlString(sb.ToString());
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath)
{
return RenderPartials(htmlHelper, archetypeModel, partialPath, null);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, ViewDataDictionary viewDataDictionary)
{
return RenderPartials(htmlHelper, archetypeModel, null, viewDataDictionary);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
return htmlHelper.RenderPartials(archetypeModel, partialPath, viewDataDictionary);
}
private static IHtmlString RenderPartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
/// <summary>
/// Renders the fieldset partial
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="fieldsetModel"></param>
/// <param name="partialPath">The partial path.</param>
/// <param name="viewDataDictionary">The view data dictionary.</param>
/// <returns></returns>
private static IHtmlString _renderPartial(HtmlHelper htmlHelper, ArchetypeFieldsetModel fieldsetModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
var context = HttpContext.Current;
if (archetypeModel == null || context == null)
if (fieldsetModel == null || context == null)
{
return new HtmlString("");
}
var sb = new StringBuilder();
//default
var pathToPartials = "~/Views/Partials/Archetype/";
if (!string.IsNullOrEmpty(partialPath))
{
pathToPartials = partialPath;
}
foreach (var fieldsetModel in archetypeModel)
{
var partial = pathToPartials + fieldsetModel.Alias + ".cshtml";
var partial = string.Format("{0}{1}.cshtml", pathToPartials, fieldsetModel.Alias);
if (System.IO.File.Exists(context.Server.MapPath(partial)))
{
sb.AppendLine(htmlHelper.Partial(partial, fieldsetModel, viewDataDictionary).ToString());
}
else
{
LogHelper.Info<ArchetypeModel>(string.Format("The partial for {0} could not be found. Please create a partial with that name or rename your alias.", context.Server.MapPath(partial)));
}
if (System.IO.File.Exists(context.Server.MapPath(partial)))
{
sb.AppendLine(htmlHelper.Partial(partial, fieldsetModel, viewDataDictionary).ToString());
}
else
{
LogHelper.Info<ArchetypeModel>(string.Format("The partial for {0} could not be found. Please create a partial with that name or rename your alias.", context.Server.MapPath(partial)));
}
return new HtmlString(sb.ToString());
}
/// <summary>
/// Renders a single archtype partial from a fieldset
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="fieldsetModel">The fieldset model.</param>
/// <returns></returns>
public static IHtmlString RenderArchetypePartial(this HtmlHelper htmlHelper, ArchetypeFieldsetModel fieldsetModel)
{
return _renderPartial(htmlHelper, fieldsetModel, null, null);
}
/// <summary>
/// Renders the archetype partial.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="fieldsetModel">The fieldset model.</param>
/// <param name="partialView">The partial view.</param>
/// <returns></returns>
public static IHtmlString RenderArchetypePartial(this HtmlHelper htmlHelper, ArchetypeFieldsetModel fieldsetModel, string partialView)
{
return _renderPartial(htmlHelper, fieldsetModel, partialView, null);
}
/// <summary>
/// Renders the archetype partial.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="fieldsetModel">The fieldset model.</param>
/// <param name="partialView">The partial view.</param>
/// <param name="viewDataDictionary">The view data dictionary.</param>
/// <returns></returns>
public static IHtmlString RenderArchetypePartial(this HtmlHelper htmlHelper, ArchetypeFieldsetModel fieldsetModel, string partialView, ViewDataDictionary viewDataDictionary)
{
return _renderPartial(htmlHelper, fieldsetModel, partialView, viewDataDictionary);
}
/// <summary>
/// Renders the archetype partials.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="archetypeModel">The archetype model.</param>
/// <returns></returns>
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel)
{
return _renderPartials(htmlHelper, archetypeModel, null, null);
}
/// <summary>
/// Renders the archetype partials.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="archetypeModel">The archetype model.</param>
/// <param name="partialPath">The partial path.</param>
/// <returns></returns>
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath)
{
return _renderPartials(htmlHelper, archetypeModel, partialPath, null);
}
/// <summary>
/// Renders the archetype partials.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="archetypeModel">The archetype model.</param>
/// <param name="viewDataDictionary">The view data dictionary.</param>
/// <returns></returns>
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, ViewDataDictionary viewDataDictionary)
{
return _renderPartials(htmlHelper, archetypeModel, null, viewDataDictionary);
}
/// <summary>
/// Renders the archetype partials.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <param name="archetypeModel">The archetype model.</param>
/// <param name="partialPath">The partial path.</param>
/// <param name="viewDataDictionary">The view data dictionary.</param>
/// <returns></returns>
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
return htmlHelper._renderPartials(archetypeModel, partialPath, viewDataDictionary);
}
}
}
@@ -0,0 +1,61 @@
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core.PropertyEditors;
namespace Archetype.Extensions
{
/// <summary>
/// PropertyEditor extensions.
/// </summary>
public static class PropertyEditorExtensions
{
/// <summary>
/// Formats the default prevalues for a property editor for use within an Archetype clientside context
/// </summary>
/// <param name="propertyEditor">The property editor</param>
/// <returns>The formatted default prevalues</returns>
public static IDictionary<string, object> DefaultPreValuesForArchetype(this PropertyEditor propertyEditor)
{
if (propertyEditor.DefaultPreValues == null || propertyEditor.DefaultPreValues.Any() == false)
{
return propertyEditor.DefaultPreValues;
}
var view = propertyEditor.ValueEditor.View.ToLowerInvariant();
// This is the extension point for default prevalues formatting, in case we need to handle any other
// property editors later on. It should be replaced with a switch statement by then, or maybe some fancy
// auto discovery of formatters :)
if (view == "imagecropper")
{
propertyEditor.FormatImageCropperDefaultPreValuesForArchetype();
}
return propertyEditor.DefaultPreValues;
}
/// <summary>
/// Format the default prevalues of the image cropper property editor
/// </summary>
/// <param name="propertyEditor"></param>
/// <remarks>
/// In order for the image cropper to work clientside, we need to make sure it's default prevalue "focalpoint" is returned
/// as a JSON object and not as the string it's defined as on the image cropper property editor.
/// </remarks>
private static void FormatImageCropperDefaultPreValuesForArchetype(this PropertyEditor propertyEditor)
{
const string focalPointKey = "focalPoint";
if (propertyEditor.DefaultPreValues.ContainsKey(focalPointKey) == false || propertyEditor.DefaultPreValues[focalPointKey] == null)
{
return;
}
var focalPoint = propertyEditor.DefaultPreValues[focalPointKey].ToString();
if (string.IsNullOrEmpty(focalPoint))
{
return;
}
// translate the JSON string to a JSON object
propertyEditor.DefaultPreValues[focalPointKey] = JsonConvert.DeserializeObject(focalPoint);
}
}
}
@@ -1,8 +1,15 @@
namespace Archetype.Extensions
{
/// <summary>
/// String extensions.
/// </summary>
public static class StringExtensions
{
//lifted from the core as it is marked 'internal'
/// <summary>
/// Detects if the input string is JSON.
/// </summary>
/// <param name="input">The input.</param>
/// <returns></returns>
public static bool DetectIsJson(this string input)
{
input = input.Trim();
@@ -2,9 +2,13 @@ using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core;
using System;
namespace Archetype.Models
{
/// <summary>
/// Model that represents a fieldset stored as content JSON.
/// </summary>
public class ArchetypeFieldsetModel
{
[JsonProperty("alias")]
@@ -16,6 +20,18 @@ namespace Archetype.Models
[JsonProperty("properties")]
public IEnumerable<ArchetypePropertyModel> Properties;
[JsonProperty("id")]
public Guid Id { get; set; }
[JsonProperty("releaseDate")]
public DateTime? ReleaseDate { get; set; }
[JsonProperty("expireDate")]
public DateTime? ExpireDate { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="ArchetypeFieldsetModel"/> class.
/// </summary>
public ArchetypeFieldsetModel()
{
Properties = new List<ArchetypePropertyModel>();
@@ -23,11 +39,22 @@ namespace Archetype.Models
#region Helper Methods
/// <summary>
/// Gets the value and returns as string.
/// </summary>
/// <param name="propertyAlias">The property alias.</param>
/// <returns></returns>
public string GetValue(string propertyAlias)
{
return GetValue<string>(propertyAlias);
}
/// <summary>
/// Gets the value based on the type passed in as a generic.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyAlias">The property alias.</param>
/// <returns></returns>
public T GetValue<T>(string propertyAlias)
{
var property = GetProperty(propertyAlias);
@@ -45,6 +72,13 @@ namespace Archetype.Models
// however, this would require GetValue<T>(string propertyAlias) to call the common implementation
// with a default(T) value, which could in theory result in a performance hit, if T for some reason
// is costly to instantiate.
/// <summary>
/// Gets the value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyAlias">The property alias.</param>
/// <param name="defaultValue">The default value.</param>
/// <returns></returns>
public T GetValue<T>(string propertyAlias, T defaultValue)
{
var property = GetProperty(propertyAlias);
@@ -57,16 +91,31 @@ namespace Archetype.Models
return property.GetValue<T>();
}
/// <summary>
/// Determines whether the property is empty.
/// </summary>
/// <param name="property">The property.</param>
/// <returns></returns>
private bool IsEmptyProperty(ArchetypePropertyModel property)
{
return (property == null || property.Value == null || string.IsNullOrEmpty(property.Value.ToString()));
}
/// <summary>
/// Determines whether the specified property alias has property.
/// </summary>
/// <param name="propertyAlias">The property alias.</param>
/// <returns></returns>
public bool HasProperty(string propertyAlias)
{
return GetProperty(propertyAlias) != null;
}
/// <summary>
/// Determines whether the specified property alias has value.
/// </summary>
/// <param name="propertyAlias">The property alias.</param>
/// <returns></returns>
public bool HasValue(string propertyAlias)
{
var property = GetProperty(propertyAlias);
@@ -76,12 +125,27 @@ namespace Archetype.Models
return !string.IsNullOrEmpty(property.Value.ToString());
}
/// <summary>
/// Gets the property.
/// </summary>
/// <param name="propertyAlias">The property alias.</param>
/// <returns></returns>
private ArchetypePropertyModel GetProperty(string propertyAlias)
{
return Properties.FirstOrDefault(p => p.Alias.InvariantEquals(propertyAlias));
}
#endregion
/// <summary>
/// Is this fieldset disabled, either explicitly or by other means?
/// </summary>
/// <returns>true if this fieldset is disabled, false otherwise</returns>
internal bool IsDisabled()
{
return Disabled
|| (ReleaseDate.HasValue && ReleaseDate > DateTime.UtcNow)
|| (ExpireDate.HasValue && DateTime.UtcNow > ExpireDate);
}
#endregion
}
}
}
@@ -1,44 +1,62 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Archetype.Models
{
/// <summary>
/// Model that represents an entire Archetype.
/// </summary>
[JsonObject]
public class ArchetypeModel : IEnumerable<ArchetypeFieldsetModel>
{
[JsonProperty("fieldsets")]
internal IEnumerable<ArchetypeFieldsetModel> Fieldsets { get; set; }
public IEnumerable<ArchetypeFieldsetModel> Fieldsets { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="ArchetypeModel"/> class.
/// </summary>
public ArchetypeModel()
{
Fieldsets = new List<ArchetypeFieldsetModel>();
}
/// <summary>
/// Returns an enumerator that iterates through the collection of fieldsets.
/// </summary>
/// <returns>
/// An enumerator that can be used to iterate through the collection.
/// </returns>
public IEnumerator<ArchetypeFieldsetModel> GetEnumerator()
{
return this.Fieldsets.Where(f => f.Disabled == false).GetEnumerator();
return this.Fieldsets.Where(f => f.IsDisabled() == false).GetEnumerator();
}
//possibly obsolete?
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
internal string SerializeForPersistence()
/// <summary>
/// Serializes for persistence. This should be used for serialization as it cleans up the JSON before saving.
/// </summary>
/// <returns></returns>
public string SerializeForPersistence()
{
var json = JObject.Parse(JsonConvert.SerializeObject(this));
var propertiesToRemove = new String[] { "propertyEditorAlias", "dataTypeId", "dataTypeGuid", "hostContentType" };
var json = JObject.Parse(JsonConvert.SerializeObject(this, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }));
var propertiesToRemove = new String[] { "propertyEditorAlias", "dataTypeId", "dataTypeGuid", "hostContentType", "editorState" };
json.Descendants().OfType<JProperty>()
.Where(p => propertiesToRemove.Contains(p.Name))
.ToList()
.ForEach(x => x.Remove());
return json.ToString(Formatting.None);//.DelintArchetypeJson();
return json.ToString(Formatting.None);
}
}
}
@@ -1,8 +1,12 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Archetype.Models
{
/// <summary>
/// Model that represents the configured Archetype options.
/// </summary>
public class ArchetypePreValue
{
[JsonProperty("showAdvancedOptions")]
@@ -12,6 +16,7 @@ namespace Archetype.Models
public bool StartWithAddButton { get; set; }
[JsonProperty("hideFieldsetToolbar")]
[Obsolete("This value is no longer used but is kept to prevent breaking changes.")]
public bool HideFieldsetToolbar { get; set; }
[JsonProperty("enableMultipleFieldsets")]
@@ -20,9 +25,15 @@ namespace Archetype.Models
[JsonProperty("enableCollapsing")]
public bool EnableCollapsing { get; set; }
[JsonProperty("enableCloning")]
public bool EnableCloning { get; set; }
[JsonProperty("enableDisabling")]
public bool EnableDisabling { get; set; }
[JsonProperty("enablePublishing")]
public bool EnablePublishing { get; set; }
[JsonProperty("hideFieldsetControls")]
public bool HideFieldsetControls { get; set; }
@@ -35,6 +46,9 @@ namespace Archetype.Models
[JsonProperty("fieldsets")]
public IEnumerable<ArchetypePreValueFieldset> Fieldsets { get; set; }
[JsonProperty("fieldsetGroups")]
public IEnumerable<ArchetypePreValueFieldsetGroup> FieldsetGroups { get; set; }
[JsonProperty("hidePropertyLabels")]
public bool HidePropertyLabels { get; set; }
@@ -50,7 +64,13 @@ namespace Archetype.Models
[JsonProperty("customViewPath")]
public string CustomViewPath { get; set; }
[JsonProperty("enableDeepDatatypeRequests")]
public bool EnableDeepDatatypeRequests { get; set; }
[JsonProperty("developerMode")]
public bool DeveloperMode { get; set; }
[JsonProperty("overrideDefaultPropertyValueConverter")]
public bool OverrideDefaultPropertyValueConverter { get; set; }
}
}
@@ -3,6 +3,9 @@ using Newtonsoft.Json;
namespace Archetype.Models
{
/// <summary>
/// Model that represents configured Archetype fieldsets.
/// </summary>
public class ArchetypePreValueFieldset
{
[JsonProperty("alias")]
@@ -25,5 +28,8 @@ namespace Archetype.Models
[JsonProperty("properties")]
public IEnumerable<ArchetypePreValueProperty> Properties { get; set; }
[JsonProperty("group")]
public ArchetypePreValueFieldsetGroup Group { get; set; }
}
}
@@ -0,0 +1,13 @@
using Newtonsoft.Json;
namespace Archetype.Models
{
/// <summary>
/// Model that represents configured groupings of Archetype fieldsets.
/// </summary>
public class ArchetypePreValueFieldsetGroup
{
[JsonProperty("name")]
public string Name { get; set; }
}
}
@@ -3,6 +3,9 @@ using Newtonsoft.Json;
namespace Archetype.Models
{
/// <summary>
/// Model that represents a configured property on an Archetype fieldset.
/// </summary>
public class ArchetypePreValueProperty
{
[JsonProperty("alias")]
@@ -9,13 +9,16 @@ using Umbraco.Web;
namespace Archetype.Models
{
/// <summary>
/// Model that represents a stored property in Archetype.
/// </summary>
public class ArchetypePropertyModel
{
[JsonProperty("alias")]
public string Alias { get; internal set; }
public string Alias { get; set; }
[JsonProperty("value")]
public object Value { get; internal set; }
public object Value { get; set; }
[JsonProperty("propertyEditorAlias")]
public string PropertyEditorAlias { get; internal set; }
@@ -26,15 +29,23 @@ namespace Archetype.Models
[JsonProperty("dataTypeGuid")]
internal string DataTypeGuid { get; set; }
// container for temporary editor state from the Umbraco backend
[JsonProperty("editorState")]
internal UmbracoEditorState EditorState { get; set; }
[JsonProperty("hostContentType")]
internal PublishedContentType HostContentType { get; set; }
/// <summary>
/// Gets the value based on the type given.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T GetValue<T>()
{
// Try Umbraco's PropertyValueConverters
var converters = UmbracoContext.Current != null ? PropertyValueConvertersResolver.Current.Converters : Enumerable.Empty<IPropertyValueConverter>();
if (converters.Any())
if (!string.IsNullOrWhiteSpace(this.PropertyEditorAlias) && converters.Any())
{
var convertedAttempt = TryConvertWithPropertyValueConverters<T>(Value, converters);
if (convertedAttempt.Success)
@@ -53,6 +64,13 @@ namespace Archetype.Models
return default(T);
}
/// <summary>
/// Tries to convert the value with property value converters.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <param name="converters">The converters.</param>
/// <returns></returns>
private Attempt<T> TryConvertWithPropertyValueConverters<T>(object value, IEnumerable<IPropertyValueConverter> converters)
{
var properyType = this.CreateDummyPropertyType();
@@ -73,6 +91,13 @@ namespace Archetype.Models
if (value2 is T)
return Attempt<T>.Succeed((T)value2);
// If ConvertDataToSource failed try ConvertSourceToObject.
var value3 = converter.ConvertSourceToObject(properyType, value2, false);
// If the value is of type T, just return it
if (value3 is T)
return Attempt<T>.Succeed((T)value3);
// Value is not final value type, so try a regular type conversion aswell
var convertAttempt = value2.TryConvertTo<T>();
if (convertAttempt.Success)
@@ -81,5 +106,15 @@ namespace Archetype.Models
return Attempt<T>.Fail();
}
/// <summary>
/// Model that represents the current UmbracoEditorState
/// </summary>
internal class UmbracoEditorState
{
// container for the names of any files selected for a property in the Umbraco backend
[JsonProperty("fileNames")]
public IEnumerable<string> FileNames;
}
}
}
}
@@ -0,0 +1,186 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
namespace Archetype.Models
{
public class ArchetypePublishedContent : IPublishedContent
{
private ArchetypeFieldsetModel _fieldset;
private IEnumerable<IPublishedContent> _parent;
private readonly Dictionary<string, IPublishedProperty> _properties;
public ArchetypePublishedContent(ArchetypeFieldsetModel fieldset, ArchetypePublishedContentSet parent = null)
{
if (fieldset == null)
throw new ArgumentNullException("fieldset");
_fieldset = fieldset;
_parent = parent ?? Enumerable.Empty<IPublishedContent>();
_properties = fieldset.Properties
.ToDictionary(
x => x.Alias,
x => new ArchetypePublishedProperty(x) as IPublishedProperty,
StringComparer.InvariantCultureIgnoreCase);
}
internal ArchetypeFieldsetModel ArchetypeFieldset
{
get { return _fieldset; }
}
public IEnumerable<IPublishedContent> Children
{
get { return Enumerable.Empty<IPublishedContent>(); }
}
public IEnumerable<IPublishedContent> ContentSet
{
get { return _parent; }
}
public PublishedContentType ContentType
{
get { return default(PublishedContentType); }
}
public DateTime CreateDate
{
get { return DateTime.MinValue; }
}
public int CreatorId
{
get { return default(int); }
}
public string CreatorName
{
get { return default(string); }
}
public string DocumentTypeAlias
{
get { return _fieldset.Alias; }
}
public int DocumentTypeId
{
get { return default(int); }
}
public int GetIndex()
{
return _parent.IndexOf(this);
}
public IPublishedProperty GetProperty(string alias, bool recurse)
{
IPublishedProperty property;
return _properties.TryGetValue(alias, out property) ? property : null;
}
public IPublishedProperty GetProperty(string alias)
{
return this.GetProperty(alias, false);
}
public int Id
{
get { return default(int); }
}
public bool IsDraft
{
get { return _fieldset.IsDisabled(); }
}
public PublishedItemType ItemType
{
get { return PublishedItemType.Content; }
}
public int Level
{
get { return default(int); }
}
public string Name
{
get { return default(string); }
}
public IPublishedContent Parent
{
get { return default(IPublishedContent); }
}
public string Path
{
get { return default(string); }
}
public ICollection<IPublishedProperty> Properties
{
get { return _properties.Values; }
}
public int SortOrder
{
get { return default(int); }
}
public int TemplateId
{
get { return default(int); }
}
public DateTime UpdateDate
{
get { return default(DateTime); }
}
public string Url
{
get { return default(string); }
}
public string UrlName
{
get { return default(string); }
}
public Guid Version
{
get { return Guid.Empty; }
}
public int WriterId
{
get { return default(int); }
}
public string WriterName
{
get { return default(string); }
}
public object this[string alias]
{
get
{
var property = this.GetProperty(alias);
return property == null
? null
: property.Value;
}
}
}
}
@@ -0,0 +1,39 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace Archetype.Models
{
public class ArchetypePublishedContentSet : IEnumerable<ArchetypePublishedContent>
{
private IEnumerable<ArchetypePublishedContent> _items { get; set; }
public ArchetypePublishedContentSet(ArchetypeModel archetype)
{
if (archetype == null)
throw new ArgumentNullException("archetype");
this.ArchetypeModel = archetype;
var count = archetype.Fieldsets.Count();
_items = archetype.Fieldsets
.Where(x => x.IsDisabled() == false)
.Select(x => new ArchetypePublishedContent(x, this))
.ToArray();
}
internal ArchetypeModel ArchetypeModel { get; private set; }
public IEnumerator<ArchetypePublishedContent> GetEnumerator()
{
return _items.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
}
@@ -0,0 +1,85 @@
using System;
using Archetype.Extensions;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
namespace Archetype.Models
{
public class ArchetypePublishedProperty : IPublishedProperty
{
private readonly object _rawValue;
private readonly Lazy<object> _sourceValue;
private readonly Lazy<object> _objectValue;
private readonly Lazy<object> _xpathValue;
private readonly ArchetypePropertyModel _property;
private readonly PublishedPropertyType _propertyType;
public ArchetypePublishedProperty(ArchetypePropertyModel property)
{
if (property == null)
throw new ArgumentNullException("property");
var preview = false;
_property = property;
_rawValue = property.Value;
_propertyType = property.CreateDummyPropertyType();
if (_propertyType != null)
{
_sourceValue = new Lazy<object>(() => _propertyType.ConvertDataToSource(_rawValue, preview));
_objectValue = new Lazy<object>(() => _propertyType.ConvertSourceToObject(_sourceValue.Value, preview));
_xpathValue = new Lazy<object>(() => _propertyType.ConvertSourceToXPath(_sourceValue.Value, preview));
}
}
internal ArchetypePropertyModel ArchetypeProperty
{
get { return _property; }
}
public object DataValue
{
get
{
return _sourceValue != null
? _sourceValue.Value
: _rawValue;
}
}
public bool HasValue
{
get
{
return _rawValue != null && !string.IsNullOrEmpty(_rawValue.ToString());
}
}
public string PropertyTypeAlias
{
get { return _property.Alias; }
}
public object Value
{
get
{
return _objectValue != null
? _objectValue.Value
: _rawValue;
}
}
public object XPathValue
{
get
{
return _xpathValue != null
? _xpathValue.Value
: _rawValue;
}
}
}
}
@@ -7,7 +7,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Imulus")]
[assembly: AssemblyProduct("Archetype")]
[assembly: AssemblyCopyright("Copyright \xa9 Imulus 2014")]
[assembly: AssemblyCopyright("MIT Licensed")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -1,4 +1,4 @@
using System.Reflection;
[assembly: AssemblyVersion("1.4.0")]
[assembly: AssemblyFileVersion("1.4.0-beta")]
[assembly: AssemblyVersion("1.13.0")]
[assembly: AssemblyFileVersion("1.13.0")]
@@ -8,22 +8,46 @@ using Umbraco.Core.Services;
namespace Archetype.PropertyConverters
{
/// <summary>
/// Default property value converter that models the JSON to a C# object.
/// </summary>
[PropertyValueType(typeof(Models.ArchetypeModel))]
[PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)]
public class ArchetypeValueConverter : PropertyValueConverterBase
{
/// <summary>
/// Gets the services.
/// </summary>
/// <value>
/// The services.
/// </value>
public ServiceContext Services
{
get { return ApplicationContext.Current.Services; }
}
/// <summary>
/// Determines whether the specified property type is converter for Archetype.
/// </summary>
/// <param name="propertyType">Type of the property.</param>
/// <returns></returns>
public override bool IsConverter(PublishedPropertyType propertyType)
{
return !String.IsNullOrEmpty(propertyType.PropertyEditorAlias)
var isArcheTypePropertyEditor = !String.IsNullOrEmpty(propertyType.PropertyEditorAlias)
&& propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias);
if (!isArcheTypePropertyEditor)
return false;
return !ArchetypeHelper.Instance.IsPropertyValueConverterOverridden(propertyType.DataTypeId);
}
/// <summary>
/// Converts the data to source.
/// </summary>
/// <param name="propertyType">Type of the property.</param>
/// <param name="source">The source.</param>
/// <param name="preview">if set to <c>true</c> [preview].</param>
/// <returns></returns>
public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview)
{
var defaultValue = new ArchetypeModel();
@@ -1,5 +1,6 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Archetype.Extensions;
using ClientDependency.Core;
using Newtonsoft.Json;
@@ -10,23 +11,34 @@ using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Umbraco.Web.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
namespace Archetype.PropertyEditors
{
[PropertyEditorAsset(ClientDependencyType.Javascript, "/App_Plugins/Archetype/js/archetype.js")]
[PropertyEditor("Imulus.Archetype", "Archetype", "/App_Plugins/Archetype/views/archetype.html", ValueType = "JSON")]
/// <summary>
/// C# representation of the property editor. This is often done with package manifest instead.
/// </summary>
[PropertyEditorAsset(ClientDependencyType.Javascript, "../App_Plugins/Archetype/js/archetype.js")]
[PropertyEditor(Constants.PropertyEditorAlias, "Archetype", "../App_Plugins/Archetype/views/archetype.html", ValueType = "JSON")]
public class ArchetypePropertyEditor : PropertyEditor
{
#region Pre Value Editor
/// <summary>
/// Creates a pre value editor instance
/// </summary>
/// <returns></returns>
protected override PreValueEditor CreatePreValueEditor()
{
return new ArchetypePreValueEditor();
}
/// <summary>
/// Class that represents the prevalue editor. This is often done with a package manifest instead.
/// </summary>
internal class ArchetypePreValueEditor : PreValueEditor
{
[PreValueField("archetypeConfig", "Config", "/App_Plugins/Archetype/views/archetype.config.html",
[PreValueField("archetypeConfig", "Config", "../App_Plugins/Archetype/views/archetype.config.html",
Description = "(Required) Describe your Archetype.")]
public string Config { get; set; }
@@ -39,121 +51,212 @@ namespace Archetype.PropertyEditors
#region Value Editor
/// <summary>
/// Creates a value editor instance
/// </summary>
/// <returns></returns>
protected override PropertyValueEditor CreateValueEditor()
{
return new ArchetypePropertyValueEditor(base.CreateValueEditor());
}
/// <summary>
/// Class that represents the actual data editor. This is often done with a package manifest instead.
/// </summary>
internal class ArchetypePropertyValueEditor : PropertyValueEditorWrapper
{
protected JsonSerializerSettings _jsonSettings;
public ArchetypePropertyValueEditor(PropertyValueEditor wrapped)
: base(wrapped) { }
: base(wrapped)
{
}
/// <summary>
/// Converts the property value for use in the front-end cache
/// </summary>
/// <param name="property"></param>
/// <param name="propertyType"></param>
/// <param name="dataTypeService"></param>
/// <returns></returns>
public override string ConvertDbToString(Property property, PropertyType propertyType, IDataTypeService dataTypeService)
{
if (property.Value == null || property.Value.ToString() == "")
return string.Empty;
//LogHelper.Info<ArchetypeHelper>(property.Value.ToString());
if(property.Value == null || property.Value.ToString() == "")
return string.Empty;
var archetype = ArchetypeHelper.Instance.DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId);
foreach (var fieldset in archetype.Fieldsets)
{
foreach (var propDef in fieldset.Properties)
foreach (var propDef in fieldset.Properties.Where(p => p.DataTypeGuid != null))
{
try
{
var dtd = dataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid));
var propType = new PropertyType(dtd) { Alias = propDef.Alias };
var prop = new Property(propType, propDef.Value);
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
propDef.Value = propEditor.ValueEditor.ConvertDbToString(prop, propType, dataTypeService);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypeHelper>(ex.Message, ex);
}
try
{
if(propDef == null || propDef.DataTypeGuid == null) continue;
var dtd = ArchetypeHelper.Instance.GetDataTypeByGuid(Guid.Parse(propDef.DataTypeGuid));
var propType = new PropertyType(dtd) {Alias = propDef.Alias};
var prop = new Property(propType, (propDef.Value != null) ? propDef.Value.ToString() : null);
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
propDef.Value = propEditor.ValueEditor.ConvertDbToString(prop, propType, dataTypeService);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypePropertyValueEditor>(ex.Message, ex);
}
}
}
return archetype.SerializeForPersistence();
return archetype.SerializeForPersistence();
}
/// <summary>
/// A method used to format the database value to a value that can be used by the editor
/// </summary>
/// <param name="property"></param>
/// <param name="propertyType"></param>
/// <param name="dataTypeService"></param>
/// <returns></returns>
/// <remarks>
/// The object returned will automatically be serialized into json notation. For most property editors
/// the value returned is probably just a string but in some cases a json structure will be returned.
/// </remarks>
public override object ConvertDbToEditor(Property property, PropertyType propertyType, IDataTypeService dataTypeService)
{
if (property.Value == null || property.Value.ToString() == "")
return string.Empty;
//LogHelper.Info<ArchetypeHelper>(property.Value.ToString());
if(property.Value == null || property.Value.ToString() == "")
return string.Empty;
var archetype = ArchetypeHelper.Instance.DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId);
foreach (var fieldset in archetype.Fieldsets)
{
foreach (var propDef in fieldset.Properties)
foreach (var propDef in fieldset.Properties.Where(p => p.DataTypeGuid != null))
{
try
{
var dtd = dataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid));
var propType = new PropertyType(dtd) { Alias = propDef.Alias };
var prop = new Property(propType, propDef.Value);
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
propDef.Value = propEditor.ValueEditor.ConvertDbToEditor(prop, propType, dataTypeService);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypeHelper>(ex.Message, ex);
}
try
{
var dtd = ArchetypeHelper.Instance.GetDataTypeByGuid(Guid.Parse(propDef.DataTypeGuid));
var propType = new PropertyType(dtd) {Alias = propDef.Alias};
var prop = new Property(propType, (propDef.Value != null) ? propDef.Value.ToString() : null);
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
propDef.Value = propEditor.ValueEditor.ConvertDbToEditor(prop, propType, dataTypeService);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypePropertyValueEditor>(ex.Message, ex);
}
}
}
return archetype;
}
public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue)
{
if (editorValue.Value == null || editorValue.Value.ToString() == "")
return string.Empty;
//LogHelper.Info<ArchetypeHelper>(editorValue.Value.ToString());
/// <summary>
/// A method to deserialize the string value that has been saved in the content editor
/// to an object to be stored in the database.
/// </summary>
/// <param name="editorValue"></param>
/// <param name="currentValue">The current value that has been persisted to the database for this editor. This value may be usesful for
/// how the value then get's deserialized again to be re-persisted. In most cases it will probably not be used.</param>
/// <returns></returns>
/// <remarks>
/// By default this will attempt to automatically convert the string value to the value type supplied by ValueType.
/// If overridden then the object returned must match the type supplied in the ValueType, otherwise persisting the
/// value to the DB will fail when it tries to validate the value type.
/// </remarks>
public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue)
{
if(editorValue.Value == null || editorValue.Value.ToString() == "")
return string.Empty;
// attempt to deserialize the current property value as an Archetype
var currentArchetype = currentValue != null ? ArchetypeHelper.Instance.DeserializeJsonToArchetype(currentValue.ToString(), editorValue.PreValues) : null;
var archetype = ArchetypeHelper.Instance.DeserializeJsonToArchetype(editorValue.Value.ToString(), editorValue.PreValues);
// get all files uploaded via the file manager (if any)
var uploadedFiles = editorValue.AdditionalData.ContainsKey("files") ? editorValue.AdditionalData["files"] as IEnumerable<ContentItemFile> : null;
foreach (var fieldset in archetype.Fieldsets)
{
// make sure the publishing dates are in UTC
fieldset.ReleaseDate = EnsureUtcDate(fieldset.ReleaseDate);
fieldset.ExpireDate = EnsureUtcDate(fieldset.ExpireDate);
// assign an id to the fieldset if it has none (e.g. newly created fieldset)
fieldset.Id = fieldset.Id == Guid.Empty ? Guid.NewGuid() : fieldset.Id;
// find the corresponding fieldset in the current Archetype value (if any)
var currentFieldset = currentArchetype != null ? currentArchetype.Fieldsets.FirstOrDefault(f => f.Id == fieldset.Id) : null;
foreach (var propDef in fieldset.Properties)
{
try
{
var dtd = ApplicationContext.Current.Services.DataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid));
var preValues = ApplicationContext.Current.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dtd.Id);
var propData = new ContentPropertyData(propDef.Value, preValues, new Dictionary<string, object>());
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
propDef.Value = propEditor.ValueEditor.ConvertEditorToDb(propData, propDef.Value);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypeHelper>(ex.Message, ex);
}
try
{
// find the corresponding property in the current Archetype value (if any)
var currentProperty = currentFieldset != null ? currentFieldset.Properties.FirstOrDefault(p => p.Alias == propDef.Alias) : null;
var dtd = ArchetypeHelper.Instance.GetDataTypeByGuid(Guid.Parse(propDef.DataTypeGuid));
var preValues = ApplicationContext.Current.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dtd.Id);
var additionalData = new Dictionary<string, object>();
// figure out if we need to pass a files collection in the additional data to the property value editor
if(uploadedFiles != null)
{
if(dtd.PropertyEditorAlias == Constants.PropertyEditorAlias)
{
// it's a nested Archetype - just pass all uploaded files to the value editor
additionalData["files"] = uploadedFiles.ToList();
}
else if (propDef.EditorState != null && propDef.EditorState.FileNames != null && propDef.EditorState.FileNames.Any())
{
// pass the uploaded files that belongs to this property (if any) to the value editor
var propertyFiles = propDef.EditorState.FileNames.Select(f => uploadedFiles.FirstOrDefault(u => u.FileName == f)).Where(f => f != null).ToList();
if(propertyFiles.Any())
{
additionalData["files"] = propertyFiles;
}
}
}
var propData = new ContentPropertyData(propDef.Value, preValues, additionalData);
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
// make sure to send the current property value (if any) to the PE ValueEditor
propDef.Value = propEditor.ValueEditor.ConvertEditorToDb(propData, currentProperty != null ? (currentProperty.Value != null) ? currentProperty.Value.ToString() : null : null);
}
catch (Exception ex)
{
LogHelper.Error<ArchetypePropertyValueEditor>(ex.Message, ex);
}
}
}
return archetype.SerializeForPersistence();
}
internal virtual PropertyEditor GetPropertyEditor(IDataTypeDefinition dtd)
{
if (dtd.Id != 0)
return PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
return dtd.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias)
? new ArchetypePropertyEditor()
: (PropertyEditor)new TextboxPropertyEditor();
}
return archetype.SerializeForPersistence();
}
/// <summary>
/// Gets the property editor.
/// </summary>
/// <param name="dtd">The DTD.</param>
/// <returns></returns>
internal virtual PropertyEditor GetPropertyEditor(IDataTypeDefinition dtd)
{
if(dtd.Id != 0)
return PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
return dtd.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias)
? new ArchetypePropertyEditor()
: (PropertyEditor) new TextboxPropertyEditor();
}
/// <summary>
/// Ensures that a datetime is in UTC
/// </summary>
/// <param name="dateTime">The datetime</param>
/// <returns>The datetime in UTC (or null if it's not set)</returns>
private DateTime? EnsureUtcDate(DateTime? dateTime)
{
if(dateTime.HasValue == false || dateTime.Value.Kind == DateTimeKind.Utc)
{
return dateTime;
}
return new DateTime(dateTime.Value.Ticks, DateTimeKind.Utc);
}
}
#endregion
#endregion
}
}
+39 -5
View File
@@ -5,12 +5,18 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
//define empty items
var newPropertyModel = '{"alias": "", "remove": false, "collapse": false, "label": "", "helpText": "", "dataTypeGuid": "0cc0eba1-9960-42c9-bf9b-60e150b429ae", "value": ""}';
var newFieldsetModel = '{"alias": "", "remove": false, "collapse": false, "labelTemplate": "", "icon": "", "label": "", "properties": [' + newPropertyModel + ']}';
var defaultFieldsetConfigModel = JSON.parse('{"showAdvancedOptions": false, "startWithAddButton": false, "hideFieldsetToolbar": false, "enableMultipleFieldsets": false, "hideFieldsetControls": false, "hidePropertyLabel": false, "maxFieldsets": null, "enableCollapsing": true, "enableDisabling": true, "fieldsets": [' + newFieldsetModel + ']}');
var newFieldsetModel = '{"alias": "", "remove": false, "collapse": false, "labelTemplate": "", "icon": "", "label": "", "properties": [' + newPropertyModel + '], "group": null}';
var defaultFieldsetConfigModel = JSON.parse('{"showAdvancedOptions": false, "startWithAddButton": false, "hideFieldsetToolbar": false, "enableMultipleFieldsets": false, "hideFieldsetControls": false, "hidePropertyLabel": false, "maxFieldsets": null, "enableCollapsing": true, "enableCloning": false, "enableDisabling": true, "enableDeepDatatypeRequests": false, "enablePublishing": false, "fieldsets": [' + newFieldsetModel + '], "fieldsetGroups": []}');
//ini the model
$scope.model.value = $scope.model.value || defaultFieldsetConfigModel;
$scope.dllVersion = "";
archetypePropertyEditorResource.getDllVersion().then(function(data){
$scope.dllVersion = data.dllVersion;
});
//ini the render model
initConfigRenderModel();
@@ -104,7 +110,7 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
//ini the properties
_.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset){
$scope.focusProperty(fieldset.properties);
$scope.focusProperty(fieldset.properties);
});
//setup JSON.stringify helpers
@@ -238,8 +244,18 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
function initConfigRenderModel()
{
$scope.archetypeConfigRenderModel = $scope.model.value;
if (!$scope.archetypeConfigRenderModel.fieldsetGroups) {
$scope.archetypeConfigRenderModel.fieldsetGroups = [];
}
_.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset){
_.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset) {
if (fieldset.group) {
// tie the fieldset group back up to the actual group object, not the clone that's been persisted
fieldset.group = _.find($scope.archetypeConfigRenderModel.fieldsetGroups, function(fieldsetGroup) {
return fieldsetGroup.name == fieldset.group.name;
})
}
fieldset.remove = false;
if (fieldset.alias.length > 0)
@@ -289,6 +305,24 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
$scope.model.value.fieldsets = fieldsets;
}
$scope.showOptions = function ($event, template) {
$event.preventDefault();
dialogService.closeAll();
dialogService.open({
template: template,
show: true,
callback: function (data) {
// replace the entire render model if it was changed (in developer options)
if (data.model && data.modelChanged) {
$scope.archetypeConfigRenderModel = data.model;
}
},
dialogData: { model: $scope.archetypeConfigRenderModel }
});
}
//archetype css
assetsService.loadCss("/App_Plugins/Archetype/css/archetype.css");
assetsService.loadCss("../App_Plugins/Archetype/css/archetype.css");
});
@@ -0,0 +1,15 @@
angular.module('umbraco').controller('ArchetypeConfigOptionsController', function ($scope) {
//handles a fieldset group add
$scope.addFieldsetGroup = function () {
$scope.dialogData.model.fieldsetGroups.push({ name: "" });
}
//handles a fieldset group removal
$scope.removeFieldsetGroup = function ($index) {
$scope.dialogData.model.fieldsetGroups.splice($index, 1);
}
$scope.apply = function(index) {
$scope.submit($scope.dialogData);
}
});
+310 -32
View File
@@ -1,4 +1,5 @@
angular.module("umbraco").controller("Imulus.ArchetypeController", function ($scope, $http, assetsService, angularHelper, notificationsService, $timeout) {
{{VERSION}}
angular.module("umbraco").controller("Imulus.ArchetypeController", function ($scope, $http, $filter, assetsService, angularHelper, notificationsService, $timeout, fileManager, entityResource, archetypeService, archetypeLabelService, archetypeCacheService, archetypePropertyEditorResource) {
//$scope.model.value = "";
$scope.model.hideLabel = $scope.model.config.hideLabel == 1;
@@ -14,52 +15,127 @@
// store the umbraco property alias to help generate unique IDs. Hopefully there's a better way to get this in the future :)
$scope.umbracoHostPropertyAlias = $scope.$parent.$parent.model.alias;
$scope.isDebuggingEnabled = Umbraco.Sys.ServerVariables.isDebuggingEnabled;
$scope.overlayMenu = {
show: false,
style: {}
};
init();
//hold references to helper resources
$scope.resources = {
entityResource: entityResource,
archetypePropertyEditorResource: archetypePropertyEditorResource
}
//hold references to helper services
$scope.services = {
archetypeService: archetypeService,
archetypeLabelService: archetypeLabelService,
archetypeCacheService: archetypeCacheService
}
//helper to get $eval the labelTemplate
$scope.getFieldsetTitle = function(fieldsetConfigModel, fieldsetIndex) {
if(!fieldsetConfigModel)
return "";
var fieldset = $scope.model.value.fieldsets[fieldsetIndex];
var fieldsetConfig = $scope.getConfigFieldsetByAlias(fieldset.alias);
var template = fieldsetConfigModel.labelTemplate;
$scope.getFieldsetTitle = function (fieldsetConfigModel, fieldsetIndex) {
return archetypeLabelService.getFieldsetTitle($scope, fieldsetConfigModel, fieldsetIndex);
}
if (template.length < 1)
return fieldsetConfig.label;
var rgx = /{{(.*?)}}*/g;
var results;
var parsedTemplate = template;
while ((results = rgx.exec(template)) !== null) {
var propertyAlias = results[1];
var propertyValue = $scope.getPropertyValueByAlias(fieldset, propertyAlias);
parsedTemplate = parsedTemplate.replace(results[0], propertyValue);
}
return parsedTemplate;
};
var draggedRteSettings;
var rteClass = ".umb-rte textarea";
//sort config
$scope.sortableOptions = {
axis: 'y',
cursor: "move",
handle: ".handle",
start: function(ev, ui) {
draggedRteSettings = {};
$(rteClass, ui.item.parent()).each(function () {
var id = $(this).attr("id");
draggedRteSettings[id] = _.findWhere(tinyMCE.editors, { id: id }).settings;
tinymce.execCommand('mceRemoveEditor', false, id);
$(this).css("visibility", "hidden");
});
},
update: function (ev, ui) {
$scope.setDirty();
},
stop: function (ev, ui) {
$(rteClass, ui.item.parent()).each(function () {
var id = $(this).attr("id");
draggedRteSettings[id] = draggedRteSettings[id] || _.findWhere(tinyMCE.editors, { id: id }).settings;
tinyMCE.execCommand("mceRemoveEditor", false, id);
tinyMCE.init(draggedRteSettings[id]);
});
}
};
//handles a fieldset add
$scope.openFieldsetPicker = function ($index, event) {
if ($scope.canAdd() == false) {
return;
}
var allFieldsets = [];
_.each($scope.model.config.fieldsets, function (fieldset) {
var icon = fieldset.icon;
allFieldsets.push({
alias: fieldset.alias,
label: fieldset.label,
icon: (fieldset.icon || "icon-document-dashed-line"), // default icon if none is chosen
group: fieldset.group ? fieldset.group.name : null
});
});
// sanity check
if (allFieldsets == 0) {
return;
}
if (allFieldsets.length == 1) {
// only one fieldset type - no need to display the picker
$scope.addRow(allFieldsets[0].alias, $index);
return;
}
$scope.overlayMenu.fieldsetGroups = [];
if ($scope.model.config.fieldsetGroups && $scope.model.config.fieldsetGroups.length > 0) {
_.each($scope.model.config.fieldsetGroups, function (fieldsetGroup) {
$scope.overlayMenu.fieldsetGroups.push({ name: fieldsetGroup.name, fieldsets: $filter("filter")(allFieldsets, { group: fieldsetGroup.name }, true) });
})
}
else {
$scope.overlayMenu.fieldsetGroups.push({ name: "", fieldsets: allFieldsets });
}
$scope.overlayMenu.index = $index;
$scope.overlayMenu.activeFieldsetGroup = $scope.overlayMenu.fieldsetGroups[0];
// calculate overlay position
// - yeah... it's jQuery (ungh!) but that's how the Grid does it.
var offset = $(event.target).offset();
var scrollTop = $(event.target).closest(".umb-panel-body").scrollTop();
if (offset.top < 400) {
$scope.overlayMenu.style.top = 300 + scrollTop;
}
else {
$scope.overlayMenu.style.top = offset.top - 150 + scrollTop;
}
$scope.overlayMenu.show = true;
};
$scope.closeFieldsetPicker = function () {
$scope.overlayMenu.show = false;
};
$scope.pickFieldset = function (fieldsetAlias, $index) {
$scope.closeFieldsetPicker();
$scope.addRow(fieldsetAlias, $index);
};
$scope.addRow = function (fieldsetAlias, $index) {
if ($scope.canAdd())
{
if ($scope.model.config.fieldsets)
{
if ($scope.canAdd()) {
if ($scope.model.config.fieldsets) {
var newFieldset = getEmptyRenderFieldset($scope.getConfigFieldsetByAlias(fieldsetAlias));
if (typeof $index != 'undefined')
@@ -71,9 +147,15 @@
$scope.model.value.fieldsets.push(newFieldset);
}
}
addCustomPropertiesToFieldset(newFieldset);
$scope.setDirty();
$scope.$broadcast("archetypeAddFieldset", {index: $index, visible: countVisible()});
newFieldset.collapse = $scope.model.config.enableCollapsing ? true : false;
$scope.focusFieldset(newFieldset);
}
}
@@ -83,6 +165,23 @@
if (confirm('Are you sure you want to remove this?')) {
$scope.setDirty();
$scope.model.value.fieldsets.splice($index, 1);
$scope.$broadcast("archetypeRemoveFieldset", {index: $index});
}
}
}
$scope.cloneRow = function ($index) {
if ($scope.canClone() && typeof $index != 'undefined') {
var newFieldset = angular.copy($scope.model.value.fieldsets[$index]);
if(newFieldset) {
$scope.model.value.fieldsets.splice($index + 1, 0, newFieldset);
$scope.setDirty();
newFieldset.collapse = $scope.model.config.enableCollapsing ? true : false;
$scope.focusFieldset(newFieldset);
}
}
}
@@ -94,8 +193,7 @@
}
//helpers for determining if a user can do something
$scope.canAdd = function ()
{
$scope.canAdd = function () {
if ($scope.model.config.maxFieldsets)
{
return countVisible() < $scope.model.config.maxFieldsets;
@@ -105,13 +203,26 @@
}
//helper that returns if an item can be removed
$scope.canRemove = function ()
{
$scope.canRemove = function () {
return countVisible() > 1
|| ($scope.model.config.maxFieldsets == 1 && $scope.model.config.fieldsets.length > 1)
|| $scope.model.config.startWithAddButton;
}
$scope.canClone = function () {
if (!$scope.model.config.enableCloning) {
return false;
}
if ($scope.model.config.maxFieldsets)
{
return countVisible() < $scope.model.config.maxFieldsets;
}
return true;
}
//helper that returns if an item can be sorted
$scope.canSort = function ()
{
@@ -130,6 +241,66 @@
///&& $scope.model.config.fieldsets.length == 1;
}
//helper that returns if an item can use publishing
$scope.canPublish = function () {
return $scope.model.config.enablePublishing;
}
//helper that returns if the "misc fieldset configuration" section should be visible
$scope.canConfigure = function () {
// currently the only thing in the "misc fieldset configuration" section is the publishing setup
return $scope.canPublish();
}
$scope.showDisableIcon = function (fieldset) {
if ($scope.canDisable() == false) {
return false;
}
// disabled state takes precedence over publishing
if (fieldset.disabled) {
return true;
}
return $scope.isDisabledByPublishing(fieldset) == false;
}
$scope.showPublishingIcon = function (fieldset) {
if ($scope.canPublish() == false) {
return false;
}
if ($scope.canDisable()) {
// disabled state takes precedence over publishing
if (fieldset.disabled) {
return false;
}
return $scope.isDisabledByPublishing(fieldset);
}
return true;
}
$scope.isDisabledByPublishing = function(fieldset) {
if ($scope.canPublish() === false) {
return false;
}
// NOTE: all comparison is done in local datetime
// - that's fine because the selected local datetimes will be converted to UTC datetimes when submitted
if (fieldset.expireDateModel && fieldset.expireDateModel.value && (moment() > moment(fieldset.expireDateModel.value))) {
// an expired release affects the fieldset
return true;
}
if (fieldset.releaseDateModel && fieldset.releaseDateModel.value && (moment(fieldset.releaseDateModel.value) > moment())) {
// a pending release affects the fieldset
return true;
}
return false;
}
$scope.isDisabled = function(fieldset) {
if (fieldset.disabled) {
return true;
}
return $scope.isDisabledByPublishing(fieldset);
}
//helper, ini the render model from the server (model.value)
function init() {
$scope.model.value = removeNulls($scope.model.value);
@@ -145,6 +316,30 @@
});
}
function addCustomProperties(fieldsets) {
// make sure we have loaded moment.js before using it
assetsService.loadJs("lib/moment/moment-with-locales.js").then(function() {
_.each(fieldsets, function(fieldset) {
addCustomPropertiesToFieldset(fieldset);
});
});
}
function addCustomPropertiesToFieldset(fieldset) {
// create models for publish configuration (utilizing the built-in datepicker data type)
// NOTE: all datetimes must be converted from UTC to local
fieldset.releaseDateModel = {
alias: _.uniqueId("archetypeReleaseDate_"),
view: "datepicker",
value: fromUtc(fieldset.releaseDate)
};
fieldset.expireDateModel = {
alias: _.uniqueId("archetypeExpireDate_"),
view: "datepicker",
value: fromUtc(fieldset.expireDate)
};
}
//helper to get the correct fieldset from config
$scope.getConfigFieldsetByAlias = function(alias) {
return _.find($scope.model.config.fieldsets, function(fieldset){
@@ -169,6 +364,12 @@
return fieldset.collapse;
}
// added to track loaded fieldsets
$scope.loadedFieldsets = [];
$scope.isLoaded = function (fieldset) {
return $scope.loadedFieldsets.indexOf(fieldset) >= 0;
}
//helper for expanding/collapsing fieldsets
$scope.focusFieldset = function(fieldset){
fixDisableSelection();
@@ -191,12 +392,14 @@
if(!fieldset && $scope.model.value.fieldsets.length == 1)
{
$scope.model.value.fieldsets[0].collapse = false;
$scope.loadedFieldsets.push($scope.model.value.fieldsets[0]);
return;
}
if(iniState && fieldset)
{
fieldset.collapse = !iniState;
$scope.loadedFieldsets.push(fieldset);
}
}
@@ -206,11 +409,36 @@
//developerMode helpers
$scope.model.value.toString = stringify;
// issue 114: register handler for file selection
$scope.model.value.setFiles = setFiles;
//encapsulate stringify (should be built into browsers, not sure of IE support)
function stringify() {
return JSON.stringify(this);
}
// issue 114: handler for file selection
function setFiles(files) {
// get all currently selected files from file manager
var currentFiles = fileManager.getFiles();
// get the files already selected for this archetype (by alias)
var archetypeFiles = [];
_.each(currentFiles, function (item) {
if (item.alias === $scope.model.alias) {
archetypeFiles.push(item.file);
}
});
// add the newly selected files
_.each(files, function (file) {
archetypeFiles.push(file);
});
// update the selected files for this archetype (by alias)
fileManager.setFiles($scope.model.alias, archetypeFiles);
}
//watch for changes
$scope.$watch('model.value', function (v) {
if ($scope.model.config.developerMode) {
@@ -220,6 +448,19 @@
$scope.model.value.toString = stringify;
}
}
// issue 114: re-register handler for files selection and reset the currently selected files on the file manager
$scope.model.value.setFiles = setFiles;
fileManager.setFiles($scope.model.alias, []);
// reset submit watcher counter on save
$scope.activeSubmitWatcher = 0;
// init loaded fieldsets tracking
$scope.loadedFieldsets = _.where($scope.model.value.fieldsets, { collapse: false });
// create properties needed for the backoffice to work (data that is not serialized to DB)
addCustomProperties($scope.model.value.fieldsets);
});
//helper to count what is visible
@@ -312,11 +553,48 @@
}
//archetype css
assetsService.loadCss("/App_Plugins/Archetype/css/archetype.css");
assetsService.loadCss("../App_Plugins/Archetype/css/archetype.css");
//custom css
if($scope.model.config.customCssPath)
{
assetsService.loadCss($scope.model.config.customCssPath);
}
// submit watcher handling:
// because some property editors use the "formSubmitting" event to set/clean up their model.value,
// we need to monitor the "formSubmitting" event from a custom property and broadcast our own event
// to forcefully update the appropriate model.value's
$scope.activeSubmitWatcher = 0;
$scope.submitWatcherOnLoad = function () {
$scope.activeSubmitWatcher++;
return $scope.activeSubmitWatcher;
}
$scope.submitWatcherOnSubmit = function (args) {
$scope.$broadcast("archetypeFormSubmitting", args);
}
// we'll use our own "archetypeFormSubmitting" event to save custom properties, as at least some
// of the editors store their values back to the model on the core "formSubmitting" event
$scope.$on("archetypeFormSubmitting", function (ev, args) {
_.each($scope.model.value.fieldsets, function (fieldset) {
// extract the publish configuration from the fieldsets (and convert local datetimes to UTC)
fieldset.releaseDate = toUtc(fieldset.releaseDateModel.value);
fieldset.expireDate = toUtc(fieldset.expireDateModel.value);
});
});
function toUtc(date) {
if (!date) {
return null;
}
return moment(date, "YYYY-MM-DD HH:mm:ss").utc().toDate();
}
function fromUtc(date) {
if (!date) {
return null;
}
return moment(moment.utc(date).toDate()).format("YYYY-MM-DD HH:mm:ss")
}
});
@@ -12,7 +12,7 @@ angular.module("umbraco.directives").directive('archetypeLocalize', function (ar
return {
restrict: "E",
rep1ace: true,
replace: true,
link: linker,
scope: {
key: '@'
+29
View File
@@ -0,0 +1,29 @@
angular.module("umbraco.directives")
.directive('archetypeClickOutside', function ($timeout, $parse) {
return {
restrict: 'A',
link: function (scope, element, attrs, ctrl) {
var fn = $parse(attrs.archetypeClickOutside);
// add click event handler (delayed so we don't trigger the callback immediately if this directive itself was triggered by a mouse click)
$timeout(function () {
$(document).on("click", mouseClick);
}, 500);
function mouseClick(event) {
if($(event.target).closest(element).length > 0) {
return;
}
var callback = function () {
fn(scope, { $event: event });
};
scope.$apply(callback);
}
// unbind event
scope.$on('$destroy', function () {
$(document).off("click", mouseClick);
});
}
};
});
+3 -3
View File
@@ -1,12 +1,12 @@
angular.module("umbraco.directives").directive('archetypeCustomView', function ($compile, $http) {
var linker = function (scope, element, attrs) {
var view = "/App_plugins/Archetype/views/archetype.default.html";
var view = "../App_plugins/Archetype/views/archetype.default.html";
if(scope.model.config.customViewPath) {
view = config.customViewPath;
view = scope.model.config.customViewPath;
}
$http.get(view).then(function(data) {
$http.get(view, { cache: true }).then(function(data) {
element.html(data.data).show();
+105 -153
View File
@@ -1,79 +1,33 @@
angular.module("umbraco.directives").directive('archetypeProperty', function ($compile, $http, archetypePropertyEditorResource, umbPropEditorHelper, $timeout, $rootScope, $q) {
function getFieldsetByAlias(fieldsets, alias)
{
return _.find(fieldsets, function(fieldset){
return fieldset.alias == alias;
});
}
function getPropertyIndexByAlias(properties, alias){
for (var i in properties)
{
if (properties[i].alias == alias) {
return i;
}
}
}
function getPropertyByAlias(fieldset, alias){
return _.find(fieldset.properties, function(property){
return property.alias == alias;
});
}
//helper that returns a JS ojbect from 'value' string or the original string
function jsonOrString(value, developerMode, debugLabel){
if(value && typeof value == 'string'){
try{
if(developerMode == '1'){
console.log("Trying to parse " + debugLabel + ": " + value);
}
value = JSON.parse(value);
}
catch(exception)
{
if(developerMode == '1'){
console.log("Failed to parse " + debugLabel + ".");
}
}
}
if(value && developerMode == '1'){
console.log(debugLabel + " post-parsing: ");
console.log(value);
}
return value;
}
angular.module("umbraco.directives").directive('archetypeProperty', function ($compile, $http, archetypePropertyEditorResource, umbPropEditorHelper, $timeout, $rootScope, $q, fileManager, editorState, archetypeService, archetypeCacheService) {
var linker = function (scope, element, attrs, ngModelCtrl) {
var configFieldsetModel = getFieldsetByAlias(scope.archetypeConfig.fieldsets, scope.fieldset.alias);
var configFieldsetModel = archetypeService.getFieldsetByAlias(scope.archetypeConfig.fieldsets, scope.fieldset.alias);
var view = "";
var label = configFieldsetModel.properties[scope.propertyConfigIndex].label;
var dataTypeGuid = configFieldsetModel.properties[scope.propertyConfigIndex].dataTypeGuid;
var config = null;
var alias = configFieldsetModel.properties[scope.propertyConfigIndex].alias;
var defaultValue = configFieldsetModel.properties[scope.propertyConfigIndex].value;
var propertyAlias = getUniquePropertyAlias(scope);
propertyAliasParts = [];
// initialize container for invalid fieldset property identifiers (store on ngModelCtrl to separate Archetype validations, e.g. when there two Archetype properties on the same document)
if(ngModelCtrl.invalidProperties == null) {
ngModelCtrl.invalidProperties = [];
}
var propertyAliasParts = [];
var propertyAlias = archetypeService.getUniquePropertyAlias(scope, propertyAliasParts);
//try to convert the defaultValue to a JS object
defaultValue = jsonOrString(defaultValue, scope.archetypeConfig.developerMode, "defaultValue");
defaultValue = archetypeService.jsonOrString(defaultValue, scope.archetypeConfig.developerMode, "defaultValue");
//grab info for the selected datatype, prepare for view
archetypePropertyEditorResource.getDataType(dataTypeGuid).then(function (data) {
archetypePropertyEditorResource.getDataType(dataTypeGuid, scope.archetypeConfig.enableDeepDatatypeRequests, editorState.current.contentTypeAlias, scope.propertyEditorAlias, alias, editorState.current.id).then(function (data) {
//transform preValues array into object expected by propertyeditor views
var configObj = {};
_.each(data.preValues, function(p) {
configObj[p.key] = p.value;
});
config = configObj;
//caching for use by label templates later
archetypeCacheService.addDatatypeToCache(data, dataTypeGuid);
//determine the view to use [...] and load it
archetypePropertyEditorResource.getPropertyEditorMapping(data.selectedEditor).then(function(propertyEditor) {
var pathToView = umbPropEditorHelper.getViewPath(propertyEditor.view);
@@ -86,98 +40,15 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
var mergedConfig = _.extend(defaultConfigObj, config);
loadView(pathToView, mergedConfig, defaultValue, alias, propertyAlias, scope, element, ngModelCtrl, validateProperty);
loadView(pathToView, mergedConfig, defaultValue, alias, propertyAlias, scope, element, ngModelCtrl, configFieldsetModel);
});
});
scope.$on("formSubmitting", function (ev, args) {
// "hard" validate to highlight any erroneous entries
_.each(scope.fieldset.properties, function (property) {
validateProperty(scope.fieldset, property, true);
});
});
scope.$on("formSubmitted", function (ev, args) {
// reset the nested fieldset validation state after submit
ngModelCtrl.invalidProperties = [];
});
// need to pass the property fieldset here to clear any invalid state of the fieldset when validating a single fieldset property
// - it's the Umbraco way to hide the invalid state when altering an invalid property, even if the new value isn't valid either
function validateProperty(fieldset, property, markAsInvalid) {
var valid = true;
fieldset.isValid = true;
property.isValid = true;
var propertyConfig = getPropertyByAlias(configFieldsetModel, property.alias);
if (propertyConfig) {
// use property.value !== property.value to check for NaN values on numeric inputs
if (propertyConfig.required && (property.value == null || property.value === "" || property.value !== property.value)) {
valid = false;
}
// issue 116: RegEx validate property value
// Only validate the property value if anything has been entered - RegEx is considered a supplement to "required".
if (valid == true && propertyConfig.regEx && property.value) {
var regEx = new RegExp(propertyConfig.regEx);
if (regEx.test(property.value) == false) {
valid = false;
}
}
// only mark the property as invalid when doing a "hard" validation
if (valid == false && markAsInvalid == true) {
property.isValid = false;
}
}
// handle nested fieldset validation by storing the identifier of all invalid fieldset properties
var propertyAliasIndex = ngModelCtrl.invalidProperties.indexOf(propertyAlias);
if (valid == false) {
if (propertyAliasIndex == -1) {
ngModelCtrl.invalidProperties.push(propertyAlias);
}
}
else {
if (propertyAliasIndex != -1) {
ngModelCtrl.invalidProperties.splice(propertyAliasIndex, 1);
}
}
if (markAsInvalid) {
// mark the entire fieldset as invalid if there are any invalid properties in the fieldset, otherwise mark it as valid
fieldset.isValid =
_.find(fieldset.properties, function (property) {
return property.isValid == false
}) == null;
}
// set invalid state if one or more fieldsets contain invalid properties
ngModelCtrl.$setValidity('validation', ngModelCtrl.invalidProperties.length == 0);
}
}
var propertyAliasParts = [];
var getUniquePropertyAlias = function (currentScope) {
if (currentScope.hasOwnProperty('fieldsetIndex') && currentScope.hasOwnProperty('property') && currentScope.hasOwnProperty('propertyConfigIndex'))
{
var currentPropertyAlias = "f" + currentScope.fieldsetIndex + "-" + currentScope.property.alias + "-p" + currentScope.propertyConfigIndex;
propertyAliasParts.push(currentPropertyAlias);
}
else if (currentScope.hasOwnProperty('isPreValue')) // Crappy way to identify this is the umbraco property scope
{
var umbracoPropertyAlias = currentScope.$parent.$parent.property.alias; // Crappy way to get the umbraco host alias once we identify its scope
propertyAliasParts.push(umbracoPropertyAlias);
}
if (currentScope.$parent)
getUniquePropertyAlias(currentScope.$parent);
return _.unique(propertyAliasParts).reverse().join("-");
};
function loadView(view, config, defaultValue, alias, propertyAlias, scope, element, ngModelCtrl, validateProperty) {
function loadView(view, config, defaultValue, alias, propertyAlias, scope, element, ngModelCtrl, configFieldsetModel) {
if (view)
{
$http.get(view).success(function (data) {
$http.get(view, { cache: true }).success(function (data) {
if (data) {
if (scope.archetypeConfig.developerMode == '1')
{
@@ -190,28 +61,108 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
scope.model.config = {};
//ini the property value after test to make sure a prop exists in the renderModel
var renderModelPropertyIndex = getPropertyIndexByAlias(scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties, alias);
scope.renderModelPropertyIndex = archetypeService.getPropertyIndexByAlias(archetypeService.getFieldset(scope).properties, alias);
if (!renderModelPropertyIndex)
if (!scope.renderModelPropertyIndex)
{
scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties.push(JSON.parse('{"alias": "' + alias + '", "value": "' + defaultValue + '"}'));
renderModelPropertyIndex = getPropertyIndexByAlias(scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties, alias);
archetypeService.getFieldset(scope).properties.push(JSON.parse('{"alias": "' + alias + '", "value": "' + defaultValue + '"}'));
scope.renderModelPropertyIndex = archetypeService.getPropertyIndexByAlias(archetypeService.getFieldset(scope).properties, alias);
}
scope.model.value = scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties[renderModelPropertyIndex].value;
scope.renderModel = {};
scope.model.value = archetypeService.getFieldsetProperty(scope).value;
//init the property editor state
archetypeService.getFieldsetProperty(scope).editorState = {};
//set the config from the prevalues
scope.model.config = config;
/*
Property Specific Hacks
Preference is to not do these, but unless we figure out core issues, this is quickest fix.
*/
//MNTP *single* hack
if(scope.model.config.maxNumber && scope.model.config.multiPicker)
{
if(scope.model.config.maxNumber == "1")
{
scope.model.config.multiPicker = "0";
}
}
//hacks for various built-in datatyps including upload, colorpicker and tags
if (!scope.propertyForm) {
scope.propertyForm = scope.form;
}
if (!scope.model.validation) {
scope.model.validation = {};
scope.model.validation.mandatory = 0;
}
//some items need an alias
scope.model.alias = "archetype-property-" + propertyAlias;
//some items also need an id (file upload for example)
scope.model.id = propertyAlias;
//watch for changes since there is no two-way binding with the local model.value
scope.$watch('model.value', function (newValue, oldValue) {
scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties[renderModelPropertyIndex].value = newValue;
archetypeService.getFieldsetProperty(scope).value = newValue;
// call validation method for the property when the value changes
// use "soft" validation to mimic the default umbraco validation style (show error highlights on submit, not while entering data)
validateProperty(scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex], scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties[renderModelPropertyIndex], false);
// notify the linker that the property value changed
archetypeService.propertyValueChanged(archetypeService.getFieldset(scope), archetypeService.getFieldsetProperty(scope));
});
scope.$on('archetypeFormSubmitting', function (ev, args) {
if(args.action !== 'save') {
// validate all fieldset properties
_.each(scope.fieldset.properties, function (property) {
archetypeService.validateProperty(scope.fieldset, property, configFieldsetModel);
});
var validationKey = "validation-f" + scope.fieldsetIndex;
ngModelCtrl.$setValidity(validationKey, scope.fieldset.isValid);
}
// did the value change (if it did, it most likely did so during the "formSubmitting" event)
var property = archetypeService.getFieldsetProperty(scope);
var currentValue = property.value;
if (currentValue != scope.model.value) {
archetypeService.getFieldsetProperty(scope).value = scope.model.value;
// notify the linker that the property value changed
archetypeService.propertyValueChanged(archetypeService.getFieldset(scope), archetypeService.getFieldsetProperty(scope));
}
});
// issue 114: handle file selection on property editors
scope.$on("filesSelected", function (event, args) {
// populate the fileNames collection on the property editor state
var property = archetypeService.getFieldsetProperty(scope);
property.editorState.fileNames = [];
_.each(args.files, function (item) {
property.editorState.fileNames.push(item.name);
});
// remove the files set for this property
// NOTE: we can't use property.alias because the file manager registers the selected files on the assigned Archetype property alias (e.g. "archetype-property-archetype-property-archetype-property-content-0-2-0-1-0-0")
fileManager.setFiles(scope.model.alias, []);
// now tell the containing Archetype to pick up the selected files
scope.archetypeRenderModel.setFiles(args.files);
});
scope.$on("archetypeRemoveFieldset", function (ev, args) {
var validationKey = "validation-f" + args.index;
ngModelCtrl.$setValidity(validationKey, true);
});
element.html(data).show();
@@ -235,6 +186,7 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
scope: {
property: '=',
propertyConfigIndex: '=',
propertyEditorAlias: '=',
archetypeConfig: '=',
fieldset: '=',
fieldsetIndex: '=',
+25
View File
@@ -0,0 +1,25 @@
angular.module("umbraco.directives").directive('archetypeSubmitWatcher', function ($rootScope) {
var linker = function (scope, element, attrs, ngModelCtrl) {
// call the load callback on scope to obtain the ID of this submit watcher
var id = scope.loadCallback ? scope.loadCallback() : 0;
scope.$on("formSubmitting", function (ev, args) {
// on the "formSubmitting" event, call the submit callback on scope to notify the Archetype controller to do it's magic
if (id == scope.activeSubmitWatcher) {
scope.submitCallback(args);
}
});
}
return {
restrict: "E",
replace: true,
link: linker,
template: "",
scope: {
loadCallback: '=',
submitCallback: '=',
activeSubmitWatcher: '='
}
}
});
+70
View File
@@ -0,0 +1,70 @@
var ArchetypeSampleLabelTemplates = (function() {
//public functions
return {
Entity: function (value, scope, args) {
if(!args.entityType) {
args = {entityType: "Document", propertyName: "name"}
}
if (value) {
//if handed a csv list, take the first only
var id = value.split(",")[0];
if (id) {
var entity = scope.services.archetypeLabelService.getEntityById(scope, id, args.entityType);
if(entity) {
return entity[args.propertyName];
}
}
}
return "";
},
UrlPicker: function(value, scope, args) {
if(!args.propertyName) {
args = {propertyName: "name"}
}
var entity;
switch (value.type) {
case "content":
if(value.typeData.contentId) {
entity = scope.services.archetypeLabelService.getEntityById(scope, value.typeData.contentId, "Document");
}
break;
case "media":
if(value.typeData.mediaId) {
entity = scope.services.archetypeLabelService.getEntityById(scope, value.typeData.mediaId, "Media");
}
break;
case "url":
return value.typeData.url;
default:
break;
}
if(entity) {
return entity[args.propertyName];
}
return "";
},
Rte: function (value, scope, args) {
if(!args.contentLength) {
args = {contentLength: 50}
}
return $(value).text().substring(0, args.contentLength);
}
}
})();
+19 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Tilføj et element",
"hideFieldsetControls": "Skjul fieldsets?",
"hideFieldsetControlsDescription": "Skjuler kontrollerne tilføj/fjern/sortér.",
"toggleAdvanced": "Slå avancerede muligheder til/fra",
@@ -33,5 +34,22 @@
"select": "Vælg",
"icon": "Ikon",
"enableDisabling": "Aktivér fieldset-deaktivering?",
"enableDisablingDescription": "Tillad brugere at aktivere/deaktivere individuelle fieldsets."
"enableDisablingDescription": "Tillad brugere at aktivere/deaktivere individuelle fieldsets.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset-grupper",
"fieldsetGroupsDescription":"Hvis du har mange fieldsets, skal du måske overveje at gruppere dem i fieldset-vælgeren. Når du først har defineret dine grupper her, vil en gruppe-vælger dukke op i fieldset-editoren, og du kan derefter vælge grupper for alle dine fieldsets.",
"fieldsetGroupName":"Navn",
"addFieldsetGroup":"Tilføj gruppe",
"enablePublishing": "Aktivér fieldset-publicering?",
"enablePublishingDescription": "Tillad automatisk udgivelse og udløb for fieldsets",
"publish": "Publicering",
"publishHelpText": "Konfigurér udgivelses- og udløbsdato for dette element",
"publishReleaseDate": "Udgivelsesdato",
"publishExpireDate": "Udløbsdato",
"settings": "Indstillinger"
}
+55
View File
@@ -0,0 +1,55 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Tilføj et element",
"hideFieldsetControls": "Skjul fieldsets?",
"hideFieldsetControlsDescription": "Skjuler kontrollerne tilføj/fjern/sortér.",
"toggleAdvanced": "Slå avancerede muligheder til/fra",
"toggleAdvancedDescription": "Vis avancerede muligheder.",
"hidePropertyLabels": "Skjul labels på egenskaber?",
"hidePropertyLabelsDescription": "Skjuler labels på egenskaber.",
"maxFieldsets": "Maks antal fieldsets",
"maxFieldsetsDescription": "Hvor mange fieldsets er tilladt? Hvis der skrives '1' vil deaktivere kontrollerne. Som standard er det ubegrænset.",
"enableMultipleFieldsets": "Aktivér flere Fieldsets?",
"enableMultipleFieldsetsDescription": "Tillader flere typer af fieldsets i denne archetype.",
"hideFieldsetToolbar": "Skjul Fieldset værktøjslinie?",
"hideFieldsetToolbarDescription": "Skjuler den fieldset værktøjslinie der fremkommer når der findes mere end ét fieldset.",
"customWrapperClass": "Egen Wrapper Class",
"customWrapperClassDescription": "(Mulighed) Angiv din egen CSS class som tilføjes på wrapper div'en.",
"cssFile": "CSS fil",
"cssFileDescription": "(Mulighed) Tilføj en sti til din egen CSS fil der skal inkluderes på siden.",
"jsFile": "JavaScript fil",
"jsFileDescription": "(Mulighed) Tilføj en sti til din egen JavaScript fil der skal inkluderes på siden.",
"toggleDeveloperMode": "Slå udvikler muligheder til/fra.",
"toggleDeveloperModeDescription": "Aktivér på udvikler muligheder.",
"configModel": "Konfigurationsmodel",
"configModelDescription": "Vær forsigt med at redigere teksten for neden, den kontrollerer skemaet for denne archetype.",
"helpText": "Hjælpe tekst",
"defaultValue": "Standard værdi",
"dataType": "Datatype",
"required": "Påkrævet",
"regEx": "RegEx validering",
"properties": "Egenskaber",
"labelTemplate": "Label skabelon",
"select": "Vælg",
"icon": "Ikon",
"enableDisabling": "Aktivér fieldset-deaktivering?",
"enableDisablingDescription": "Tillad brugere at aktivere/deaktivere individuelle fieldsets.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset-grupper",
"fieldsetGroupsDescription":"Hvis du har mange fieldsets, skal du måske overveje at gruppere dem i fieldset-vælgeren. Når du først har defineret dine grupper her, vil en gruppe-vælger dukke op i fieldset-editoren, og du kan derefter vælge grupper for alle dine fieldsets.",
"fieldsetGroupName":"Navn",
"addFieldsetGroup":"Tilføj gruppe",
"enablePublishing": "Aktivér fieldset-publicering?",
"enablePublishingDescription": "Tillad automatisk udgivelse og udløb for fieldsets",
"publish": "Publicering",
"publishHelpText": "Konfigurér udgivelses- og udløbsdato for dette element",
"publishReleaseDate": "Udgivelsesdato",
"publishExpireDate": "Udløbsdato",
"settings": "Indstillinger"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+48
View File
@@ -0,0 +1,48 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
"toggleAdvancedDescription": "Show advanced options.",
"hidePropertyLabels": "Hide Property Labels?",
"hidePropertyLabelsDescription": "Hides the property labels.",
"maxFieldsets": "Max Fieldsets",
"maxFieldsetsDescription": "How many Fieldsets are allowed? Entering '1' will disable the controls. Default is unlimited.",
"enableMultipleFieldsets": "Enable Multiple Fieldsets?",
"enableMultipleFieldsetsDescription": "Allows multiple types of fieldsets within this archetype.",
"hideFieldsetToolbar": "Hide Fieldset Toolbar?",
"hideFieldsetToolbarDescription": "Hides the fieldset toolbar that appears when more than one fieldset model appears.",
"customWrapperClass": "Custom Wrapper Class",
"customWrapperClassDescription": "(Optional) Enter a custom CSS class that will be applied to the wrapper div.",
"cssFile": "CSS File",
"cssFileDescription": "(Optional) Enter a path for a custom CSS file to be included on the page.",
"jsFile": "JS File",
"jsFileDescription": "(Optional) Enter a path for a custom JS file to be included on the page.",
"toggleDeveloperMode": "Toggle Developer Mode",
"toggleDeveloperModeDescription": "Turn on for developer options.",
"configModel": "Config Model",
"configModelDescription": "Be careful editing the text below, it controls the schema for this archetype.",
"helpText": "Help Text",
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+48
View File
@@ -0,0 +1,48 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
"toggleAdvancedDescription": "Show advanced options.",
"hidePropertyLabels": "Hide Property Labels?",
"hidePropertyLabelsDescription": "Hides the property labels.",
"maxFieldsets": "Max Fieldsets",
"maxFieldsetsDescription": "How many Fieldsets are allowed? Entering '1' will disable the controls. Default is unlimited.",
"enableMultipleFieldsets": "Enable Multiple Fieldsets?",
"enableMultipleFieldsetsDescription": "Allows multiple types of fieldsets within this archetype.",
"hideFieldsetToolbar": "Hide Fieldset Toolbar?",
"hideFieldsetToolbarDescription": "Hides the fieldset toolbar that appears when more than one fieldset model appears.",
"customWrapperClass": "Custom Wrapper Class",
"customWrapperClassDescription": "(Optional) Enter a custom CSS class that will be applied to the wrapper div.",
"cssFile": "CSS File",
"cssFileDescription": "(Optional) Enter a path for a custom CSS file to be included on the page.",
"jsFile": "JS File",
"jsFileDescription": "(Optional) Enter a path for a custom JS file to be included on the page.",
"toggleDeveloperMode": "Toggle Developer Mode",
"toggleDeveloperModeDescription": "Turn on for developer options.",
"configModel": "Config Model",
"configModelDescription": "Be careful editing the text below, it controls the schema for this archetype.",
"helpText": "Help Text",
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+48
View File
@@ -0,0 +1,48 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
"toggleAdvancedDescription": "Show advanced options.",
"hidePropertyLabels": "Hide Property Labels?",
"hidePropertyLabelsDescription": "Hides the property labels.",
"maxFieldsets": "Max Fieldsets",
"maxFieldsetsDescription": "How many Fieldsets are allowed? Entering '1' will disable the controls. Default is unlimited.",
"enableMultipleFieldsets": "Enable Multiple Fieldsets?",
"enableMultipleFieldsetsDescription": "Allows multiple types of fieldsets within this archetype.",
"hideFieldsetToolbar": "Hide Fieldset Toolbar?",
"hideFieldsetToolbarDescription": "Hides the fieldset toolbar that appears when more than one fieldset model appears.",
"customWrapperClass": "Custom Wrapper Class",
"customWrapperClassDescription": "(Optional) Enter a custom CSS class that will be applied to the wrapper div.",
"cssFile": "CSS File",
"cssFileDescription": "(Optional) Enter a path for a custom CSS file to be included on the page.",
"jsFile": "JS File",
"jsFileDescription": "(Optional) Enter a path for a custom JS file to be included on the page.",
"toggleDeveloperMode": "Toggle Developer Mode",
"toggleDeveloperModeDescription": "Turn on for developer options.",
"configModel": "Config Model",
"configModelDescription": "Be careful editing the text below, it controls the schema for this archetype.",
"helpText": "Help Text",
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+12 -1
View File
@@ -1,6 +1,7 @@
{
"label": "Label",
"alias": "Alias",
"addFieldset": "Add an item",
"hideFieldsetControls": "Hide Fieldset Controls?",
"hideFieldsetControlsDescription": "Hides the fieldset add/remove/sort controls.",
"toggleAdvanced": "Toggle Advanced Options",
@@ -33,5 +34,15 @@
"select": "Select",
"icon": "Icon",
"enableDisabling": "Enable Fieldset Disabling?",
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled."
"enableDisablingDescription": "Allows fieldsets to be individually enabled/disabled.",
"deepDatatypeRequest":"Enable Deep Datatype Requests?",
"deepDatatypeRequestDescription":"Allows for easier datatype interception at the cost of caching performance.",
"overrideDefaultConverterDescription":"Check this if you wish to use your own custom property value converter.",
"overrideDefaultConverter":"Override Default Property Value Converter?",
"enableCloning":"Enable Cloning?",
"enableCloningDescription":"Enable Fieldset Cloning.",
"fieldsetGroups":"Fieldset groups",
"fieldsetGroupsDescription":"If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.",
"fieldsetGroupName":"Name",
"addFieldsetGroup":"Add group"
}
+479 -284
View File
@@ -1,8 +1,28 @@
.archetypeEditor {
{{VERSION}}
.archetypeEditor {
width: 98%;
.usky-grid {
.cell-tools-menu {
height: 385px;
}
&.withGroups {
.cell-tools-menu {
height: 415px;
}
}
}
.open {
position: relative;
}
.dropdown-menu {
top: auto;
> li > a {
border-radius: 6px;
}
}
.controls-no-label {
@@ -10,113 +30,322 @@
}
a+ul.dropdown-menu {
margin-left: 25px;
}
}
.archetypeEditor fieldset{
border: 1px solid #dddddd;
padding: 0;
margin-bottom: 5px;
background-color: #f1f1f1;
clear: both;
display: inline-block;
width: 100%;
}
.archetypeEditor .archetypeFieldsetLabel {
position: relative;
width: 100%;
.label-sub {
padding: 8px 0;
display: inline-block;
&.module-label {
width: 100%;
}
margin-left: 0;
}
.dropdown-menu {
position: relative;
padding: 0;
border-radius: 0;
box-shadow: none;
margin-top: -10px;
/*margin-left: -200px;*/
}
span {
font-weight: bold;
&.menu-label { font-weight: normal; }
}
label:hover {
cursor: default;
}
&.enableCollapsing:hover {
cursor: pointer;
label {
span {
text-decoration: underline;
}
&:hover {
cursor: pointer;
}
}
.fieldsetIcon {
float: left;
padding: 0 4px 0 0;
color: #333;
vertical-align: text-bottom;
}
.caret {
margin: 8px 1px 0 15px;
margin: 8px 1px 0 2px;
&.caret-right {
border-bottom: 4px solid transparent;
border-top: 4px solid transparent;
border-left: 4px solid #000000;
border-left: 4px solid #ddd;
content: "";
margin-top: 6px;
}
}
label{
margin-bottom: 0;
margin-left: 5px;
fieldset {
border-bottom: 1px dashed #dddddd;
padding: 0;
span {
display: inline-block;
margin-bottom: 5px;
clear: both;
display: inline-block;
width: 100%;
.archetypeProperty {
clear: both;
overflow: visible;
margin-top: 3px;
label {
padding-left: 5px !important;
span {
color: #343434;
}
&.dimmed span {
color: #d9d9d9;
}
}
.publishOptions {
.publishDate {
display: inline-block;
vertical-align: top;
margin-right: 20px;
label {
padding: 0 !important;
margin: 0 !important;
}
}
}
}
&.dimmed {
color: #d9d9d9;
.archetypeFieldsetLabel {
position: relative;
width: 100%;
min-height: 42px;
.label-sub {
padding: 8px 0 8px 0;
display: inline-block;
min-height: 20px; /* this makes the header clickable when there's no icon and no text */
&.module-label {
width: 100%;
}
&:hover {
cursor: pointer;
label {
span {
text-decoration: underline;
}
&:hover {
cursor: pointer;
}
}
.caret-right {
border-left-color: #333;
}
}
}
.dropdown-menu {
position: relative;
padding: 0;
border-radius: 0;
box-shadow: none;
margin-top: -10px;
}
span {
font-weight: bold;
&.menu-label { font-weight: normal; }
}
label:hover {
cursor: default;
}
.caret {
position: absolute;
}
label {
margin-bottom: 0;
margin-left: 18px;
white-space: nowrap;
padding: 0;
width: ~"calc(100% - 144px)";
position: absolute;
span {
display: block;
overflow: hidden;
text-overflow: ellipsis;
}
&.dimmed {
i, span {
color: #d9d9d9 !important;
}
}
}
.archetypeEditorControls {
float: none;
position: absolute;
right: 15px;
top: 0;
.icon {
color: #ddd;
padding: 2px;
font-size: 16px;
&:hover {
color: #333;
}
&.icon-delete:hover {
color: #b94a48;
}
&.icon-disabled {
cursor: default;
&:hover {
color: #ddd;
}
}
&.icon-active {
color: #333;
&:hover {
color: #333;
}
}
}
}
&:hover {
}
}
.archetypePropertyError {
margin-bottom: 5px;
padding-top: 3px;
padding-bottom: 3px;
label {
span {
color: #b94a48;
font-weight: bold;
}
}
}
.archetypeCollapser {
clear: both;
height: 100%;
padding: 12px 0 0 20px;
background-color: #fff;
border-radius: 0 0 0 5px;
form {
margin-left:20px;
.control-label {
padding-top: 0 !important;
}
}
.archetypeFieldsetHelpText {
clear:both;
margin-bottom: 3px;
font-size: 12px;
}
}
}
.archetypeDeveloperModel
{
font-family: monospace;
width: 98%;
min-height: 100px;
margin-bottom: 10px;
border: 1px solid red;
}
.archetypeFieldsetError {
border: 1px solid #b94a48;
}
.archetypeAddButton {
color: #ddd;
.icon {
vertical-align: text-top;
}
&:hover {
color: #333;
text-decoration: none;
cursor: pointer;
.archetypeAddButtonText {
text-decoration: underline;
}
.icon {
color: #333;
}
}
}
.multiPropertyTextbox {
margin-bottom: 3px;
}
ul {
list-style: none;
margin-left: 0;
}
.show-validation.ng-invalid .control-group.error .control-label {
span {
color: #343434;
}
}
.fieldsetPicker {
.icon {
color: #333;
}
ul.elements li {
overflow: visible;
vertical-align: top;
height: 90px;
}
ul.groups {
display: block;
margin: 0;
padding: 4px;
li {
width: auto;
margin: 0;
padding: 0 20px;
font-weight: bold;
a {
color: #d9d9d9;
cursor: pointer;
}
&.active a, a:hover {
color: #999;
text-decoration: none;
}
}
}
}
.settingsWrapper {
&:hover {
caret {
background-color: #333;
}
}
.settingsHeader {
label {
display: inline-block;
}
&:hover {
cursor: pointer;
label {
text-decoration: underline;
}
.caret-right {
border-left-color: #333;
}
}
}
.settings {
padding: 14px;
background-color: #f8f8f8;
overflow: hidden;
}
}
}
.archetypeEditor .archetypeCollapser{
clear: both;
height: 100%;
padding-top: 12px;
background-color: #fff;
border-top: 1px solid silver;
border-radius: 0 0 0 5px;
overflow: hidden;
}
.archetypeEditor .multiPropertyTextbox{
margin-bottom: 3px;
}
.archetypeEditor ul{
list-style: none;
margin-left: 0;
}
.archetypeEditor,
.archetypeConfig {
.archetypeEditor, .archetypeConfig {
.archetypeEditorControls {
float: right;
}
.archetypeEditorControls, .archetypeFieldsetGroups {
i {
cursor: pointer;
&.handle {
@@ -129,213 +358,189 @@
}
}
.archetypeEditor .archetypeEditorControls {
float: none;
position: absolute;
right: 15px;
top: 0;
}
.archetypeConfig .archetypeEditorControls {
float: right;
}
.archetypeEditor form {
margin-left:20px;
.control-label {
padding-top: 0 !important;
}
}
.archetypeEditor .archetypeProperty{
clear: both;
overflow: visible;
margin-top: 3px;
}
.archetypeEditor .archetypeDeveloperModel
{
font-family: monospace;
width: 98%;
min-height: 100px;
margin-bottom: 10px;
border: 1px solid red;
}
.archetypeEditor .archetypeFieldsetToolbar {
margin-bottom: 10px;
overflow: hidden;
li {
float: left;
padding: 2px 4px;
margin-right: 10px;
border: 1px solid #ddd;
cursor: pointer;
}
}
.archetypeEditor .archetypeFieldsetHeaderText{
clear:both;
margin-bottom: 3px;
font-size: 12px;
}
.archetypeEditor .archetypeFieldsetFooterText{
clear:both;
margin-bottom: 3px;
font-size: 12px;
}
.archetypeEditor .archetypeFieldsetHelpText{
clear:both;
margin-bottom: 3px;
font-size: 12px;
}
.archetypeConfig {
margin-bottom: 20px;
}
.archetypeConfig ul{
list-style: none;
}
.archetype-headline {
.archetypeConfig li{
background-color: #fff;
}
img {
margin-right: 5px;
}
.archetypeConfig label{
width: 120px;
}
.archetypeConfig .archetypeFieldsetWrapper{
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.archetypeConfig .archetypeFieldsetOption{
margin-bottom: 15px;
input[type=text]{
max-width: 300px;
small {
margin-left: 5px;
}
a {
float: right;
img {
width: 35px;
}
}
}
}
.archetypeConfig .archetypeDeveloperModel {
font-family: monospace;
width: 88%;
margin: 5px 10px 10px;
height: 130px;
}
.archetypeConfig .archetypePropertiesWrapper {
border: 1px solid #ddd;
padding: 8px;
margin: -40px 10px 10px 140px;
max-width: 475px;
.manual-link {
color: blue;
}
ul {
padding: 0;
margin: 0;
list-style: none;
}
li {
background-color: #fff;
}
label {
width: 120px;
padding-left: 0;
}
.archetypeEditorControls {
float: right;
}
.archetypeFieldsets {
margin-left: 0;
}
.archetypeFieldsetWrapper {
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
background-color: #eee;
}
.archetypeFieldsetTitle {
cursor: pointer;
overflow: hidden;
}
.archetypeFieldsetOption {
margin-bottom: 15px;
margin-right: 15px;
input[type=text]{
max-width: 100%;
width: 100%;
}
}
.archetypeDeveloperModel {
font-family: monospace;
width: 88%;
margin: 5px 10px 10px;
height: 130px;
}
.archetypeOptions {
.btn {
margin-bottom: 5px;
}
label{
width: 400px;
}
}
.archetypePropertiesWrapper {
border: 1px solid #ddd;
padding: 8px;
margin: -40px 10px 10px 140px;
ul {
padding: 0;
margin: 0;
}
li {
padding: 10px;
margin-bottom: 10px;
background-color: #eee;
input[type=text] {
max-width: 100%;
width: 100%;
}
select {
max-width: 100%;
width: 100%;
}
}
li:last-child {
margin-bottom: 0;
}
}
.archetypeAdvancedOptions {
label {
width: 100%;
}
input[type=text] {
max-width: 190px;
width: auto;
width: 100%;
}
select {
max-width: 160px;
input[type=checkbox] {
margin-top: 0;
margin-right: 2px;
}
small {
color: #b3b3b3;
}
.archetypeFieldsetGroups {
padding: 0 10px;
margin-bottom: 20px;
ul {
padding: 0;
margin: 0;
margin-top: 15px;
li {
label {
width: 120px;
}
input {
vertical-align: middle;
width: 240px;
}
}
}
}
}
.archetypeMaxFieldsets{
border: 1px solid #ddd;
width: 40px;
text-align: right;
}
.archetypePropertyTitle {
cursor: pointer;
overflow: hidden;
}
.archetypePropertyCollapser {
margin-top: 10px;
div {
margin-bottom: 10px;
margin-right: 15px;
}
}
li:last-child {
margin-bottom: 0;
.archetypeFieldsetCollapser {
margin-top: 15px;
}
}
.archetypeConfig .archetypeFieldsets {
margin-left: 0;
}
.archetypeConfig .archetypeFieldsetTitle {
cursor: pointer;
overflow: hidden;
}
.archetypeConfig .archetypeOptions label{
width: 400px;
}
.archetypeConfig .archetypeAdvancedOptions {
margin-top: 15px;
div {
margin-bottom: 10px;
}
label {
width: 400px;
}
}
.archetypeConfig .archetypeMaxFieldsets{
border: 1px solid #ddd;
width: 40px;
text-align: right;
}
.archetypeConfig .archetypePropertyTitle {
cursor: pointer;
overflow: hidden;
}
.archetypeConfig .archetypePropertyCollapser{
margin-top: 10px;
div {
margin-bottom: 10px;
}
}
.archetypeEditor .archetypeFieldsetError{
border: 1px solid #b94a48;
}
.archetypeEditor .archetypeProperty {
label {
span {
color: #343434;
}
&.dimmed span {
color: #d9d9d9;
}
}
}
.archetypeEditor .archetypePropertyError{
margin-bottom: 5px;
padding-top: 3px;
padding-bottom: 3px;
label {
span {
color: #b94a48;
font-weight: bold;
}
}
}
.archetypeEditor .archetypeAddButton:hover {
text-decoration: none;
.archetypeAddButtonText {
text-decoration: underline;
.fieldsetIcon {
margin-right: 10px;
}
}
@@ -344,16 +549,6 @@
background-color: #d0e7f1 !important;
}
.archetypeConfig .archetypeFieldsetCollapser {
margin-top: 15px;
}
.archetypeConfig .fieldsetIcon {
margin-right: 10px;
}
.archetypeEditor .show-validation.ng-invalid .control-group.error .control-label {
span {
color: #343434;
}
}
.archetype-dialog {
margin: 10px;
}
@@ -0,0 +1,41 @@
angular.module('umbraco.resources').factory('archetypePropertyEditorResource', function($q, $http, umbRequestHelper){
return {
getAllDataTypes: function() {
// Hack - grab DataTypes from Tree API, as `dataTypeService.getAll()` isn't implemented yet
return umbRequestHelper.resourcePromise(
$http.get("backoffice/ArchetypeApi/ArchetypeDataType/GetAll"), 'Failed to retrieve datatypes from tree service'
);
},
getDataType: function (guid, useDeepDatatypeLookup, contentTypeAlias, propertyTypeAlias, archetypeAlias, nodeId) {
if(useDeepDatatypeLookup) {
return umbRequestHelper.resourcePromise(
$http.get("backoffice/ArchetypeApi/ArchetypeDataType/GetByGuid?guid=" + guid + "&contentTypeAlias=" + contentTypeAlias + "&propertyTypeAlias=" + propertyTypeAlias + "&archetypeAlias=" + archetypeAlias + "&nodeId=" + nodeId), 'Failed to retrieve datatype'
);
}
else {
return umbRequestHelper.resourcePromise(
$http.get("backoffice/ArchetypeApi/ArchetypeDataType/GetByGuid?guid=" + guid , { cache: true }), 'Failed to retrieve datatype'
);
}
},
getPropertyEditorMapping: function(alias) {
return umbRequestHelper.resourcePromise(
$http.get("backoffice/ArchetypeApi/ArchetypeDataType/GetAllPropertyEditors", { cache: true }), 'Failed to retrieve datatype mappings'
).then(function (data) {
var result = _.find(data, function(d) {
return d.alias === alias;
});
if (result != null)
return result;
return "";
});
},
getDllVersion: function() {
return umbRequestHelper.resourcePromise(
$http.get("backoffice/ArchetypeApi/ArchetypeDataType/GetDllVersion", { cache: true }), 'Failed to retrieve dll version'
);
}
}
});
-29
View File
@@ -1,29 +0,0 @@
angular.module('umbraco.resources').factory('archetypePropertyEditorResource', function($q, $http, umbRequestHelper){
return {
getAllDataTypes: function() {
// Hack - grab DataTypes from Tree API, as `dataTypeService.getAll()` isn't implemented yet
return umbRequestHelper.resourcePromise(
$http.get("/umbraco/backoffice/ArchetypeApi/ArchetypeDataType/GetAll"), 'Failed to retrieve datatypes from tree service'
);
},
getDataType: function(guid) {
return umbRequestHelper.resourcePromise(
$http.get("/umbraco/backoffice/ArchetypeApi/ArchetypeDataType/GetByGuid?guid=" + guid), 'Failed to retrieve datatype'
);
},
getPropertyEditorMapping: function(alias) {
return umbRequestHelper.resourcePromise(
$http.get("/umbraco/backoffice/ArchetypeApi/ArchetypeDataType/GetAllPropertyEditors"), 'Failed to retrieve datatype mappings'
).then(function (data) {
var result = _.find(data, function(d) {
return d.alias === alias;
});
if (result != null)
return result;
return "";
});
}
}
});
+78
View File
@@ -0,0 +1,78 @@
angular.module('umbraco.services').factory('archetypeCacheService', function (archetypePropertyEditorResource) {
//private
var isEntityLookupLoading = false;
var entityCache = [];
var isDatatypeLookupLoading = false;
var datatypeCache = [];
return {
getDataTypeFromCache: function(guid) {
return _.find(datatypeCache, function (dt){
return dt.dataTypeGuid == guid;
});
},
addDatatypeToCache: function(datatype, dataTypeGuid) {
var cachedDatatype = this.getDataTypeFromCache(dataTypeGuid);
if(!cachedDatatype) {
datatype.dataTypeGuid = dataTypeGuid;
datatypeCache.push(datatype);
}
},
getDatatypeByGuid: function(guid) {
var cachedDatatype = this.getDataTypeFromCache(guid);
if(cachedDatatype) {
return cachedDatatype;
}
//go get it from server, but this should already be pre-populated from the directive, but I suppose I'll leave this in in case used ad-hoc
if (!isDatatypeLookupLoading) {
isDatatypeLookupLoading = true;
archetypePropertyEditorResource.getDataType(guid).then(function(datatype) {
datatype.dataTypeGuid = guid;
datatypeCache.push(datatype);
isDatatypeLookupLoading = false;
return datatype;
});
}
return null;
},
getEntityById: function(scope, id, type) {
var cachedEntity = _.find(entityCache, function (e){
return e.id == id;
});
if(cachedEntity) {
return cachedEntity;
}
//go get it from server
if (!isEntityLookupLoading) {
isEntityLookupLoading = true;
scope.resources.entityResource.getById(id, type).then(function(entity) {
entityCache.push(entity);
isEntityLookupLoading = false;
return entity;
});
}
return null;
}
}
});
+279
View File
@@ -0,0 +1,279 @@
angular.module('umbraco.services').factory('archetypeLabelService', function (archetypeCacheService) {
//private
function executeFunctionByName(functionName, context) {
var args = Array.prototype.slice.call(arguments).splice(2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
if(context && context[func]) {
return context[func].apply(this, args);
}
return "";
}
function getNativeLabel(datatype, value, scope) {
switch (datatype.selectedEditor) {
case "Imulus.UrlPicker":
return imulusUrlPicker(value, scope, {});
case "Umbraco.TinyMCEv3":
return coreTinyMce(value, scope, {});
case "Umbraco.MultiNodeTreePicker":
return coreMntp(value, scope, datatype);
case "Umbraco.MediaPicker":
return coreMediaPicker(value, scope, datatype);
case "Umbraco.DropDown":
return coreDropdown(value, scope, datatype);
case "RJP.MultiUrlPicker":
return rjpMultiUrlPicker(value, scope, {});
default:
return "";
}
}
function coreDropdown(value, scope, args) {
if(!value)
return "";
var prevalue = args.preValues[0].value[value];
if(prevalue) {
return prevalue.value;
}
return "";
}
function coreMntp(value, scope, args) {
var ids = value.split(',');
var type = "Document";
switch(args.preValues[0].value.type) {
case 'content':
type = 'Document';
break;
case 'media':
type = 'media';
break;
case 'member':
type = 'member';
break;
default:
break;
}
var entityArray = [];
_.each(ids, function(id){
if(id) {
var entity = archetypeCacheService.getEntityById(scope, id, type);
if(entity) {
entityArray.push(entity.name);
}
}
});
return entityArray.join(', ');
}
function coreMediaPicker(value, scope, args) {
if(value) {
var entity = archetypeCacheService.getEntityById(scope, value, "media");
if(entity) {
return entity.name;
}
}
return "";
}
function imulusUrlPicker(value, scope, args) {
if(!args.propertyName) {
args = {propertyName: "name"}
}
var entity;
switch (value.type) {
case "content":
if(value.typeData.contentId) {
entity = archetypeCacheService.getEntityById(scope, value.typeData.contentId, "Document");
}
break;
case "media":
if(value.typeData.mediaId) {
entity = archetypeCacheService.getEntityById(scope, value.typeData.mediaId, "Media");
}
break;
case "url":
return value.typeData.url;
default:
break;
}
if(entity) {
return entity[args.propertyName];
}
return "";
}
function coreTinyMce(value, scope, args) {
if(!args.contentLength) {
args = {contentLength: 50}
}
var suffix = "";
var strippedText = $("<div/>").html(value).text();
if(strippedText.length > args.contentLength) {
suffix = "…";
}
return strippedText.substring(0, args.contentLength) + suffix;
}
function rjpMultiUrlPicker(values, scope, args) {
var names = [];
_.each(values, function (value) {
if (value.name) {
names.push(value.name);
}
});
return names.join(", ");
}
return {
getFieldsetTitle: function(scope, fieldsetConfigModel, fieldsetIndex) {
//console.log(scope.model.config);
if(!fieldsetConfigModel)
return "";
var fieldset = scope.model.value.fieldsets[fieldsetIndex];
var fieldsetConfig = scope.getConfigFieldsetByAlias(fieldset.alias);
var template = fieldsetConfigModel.labelTemplate;
if (template.length < 1)
return fieldsetConfig.label;
var rgx = /({{(.*?)}})*/g;
var results;
var parsedTemplate = template;
var rawMatches = template.match(rgx);
var matches = [];
_.each(rawMatches, function(match){
if(match) {
matches.push(match);
}
});
_.each(matches, function (match) {
// split the template in case it consists of multiple property aliases and/or functions
var templates = match.replace("{{", '').replace("}}", '').split("|");
var templateLabelValue = "";
for(var i = 0; i < templates.length; i++) {
// stop looking for a template label value if a previous template part already yielded a value
if(templateLabelValue != "") {
break;
}
var template = templates[i];
//test for function
var beginParamsIndexOf = template.indexOf("(");
var endParamsIndexOf = template.indexOf(")");
//if passed a function
if(beginParamsIndexOf != -1 && endParamsIndexOf != -1)
{
var functionName = template.substring(0, beginParamsIndexOf);
var propertyAlias = template.substring(beginParamsIndexOf + 1, endParamsIndexOf).split(',')[0];
var args = {};
var beginArgsIndexOf = template.indexOf(',');
if(beginArgsIndexOf != -1) {
var argsString = template.substring(beginArgsIndexOf + 1, endParamsIndexOf).trim();
var normalizedJsonString = argsString.replace(/(\w+)\s*:/g, '"$1":');
args = JSON.parse(normalizedJsonString);
}
templateLabelValue = executeFunctionByName(functionName, window, scope.getPropertyValueByAlias(fieldset, propertyAlias), scope, args);
}
//normal {{foo}} syntax
else {
propertyAlias = template;
var rawValue = scope.getPropertyValueByAlias(fieldset, propertyAlias);
templateLabelValue = rawValue;
//determine the type of editor
var propertyConfig = _.find(fieldsetConfigModel.properties, function(property){
return property.alias == propertyAlias;
});
if(propertyConfig) {
var datatype = archetypeCacheService.getDatatypeByGuid(propertyConfig.dataTypeGuid);
if(datatype) {
//try to get built-in label
var label = getNativeLabel(datatype, templateLabelValue, scope);
if(label) {
templateLabelValue = label;
}
else {
templateLabelValue = templateLabelValue;
}
}
}
else {
return templateLabelValue;
}
}
}
if(!templateLabelValue) {
templateLabelValue = "";
}
parsedTemplate = parsedTemplate.replace(match, templateLabelValue);
});
return parsedTemplate;
}
}
});
@@ -24,7 +24,7 @@ angular.module('umbraco.services').factory('archetypeLocalizationService', funct
initLocalizedResources:function () {
var deferred = $q.defer();
userService.getCurrentUser().then(function(user){
$http.get("/App_plugins/Archetype/langs/" + user.locale + ".js")
$http.get("../App_plugins/Archetype/langs/" + user.locale + ".js", { cache: true })
.then(function(response){
service.resourceFileLoaded = true;
service.dictionary = response.data;
+104
View File
@@ -0,0 +1,104 @@
angular.module('umbraco.services').factory('archetypeService', function () {
//public
return {
//helper that returns a JS ojbect from 'value' string or the original string
jsonOrString: function (value, developerMode, debugLabel){
if(value && typeof value == 'string'){
try{
if(developerMode == '1'){
console.log("Trying to parse " + debugLabel + ": " + value);
}
value = JSON.parse(value);
}
catch(exception)
{
if(developerMode == '1'){
console.log("Failed to parse " + debugLabel + ".");
}
}
}
if(value && developerMode == '1'){
console.log(debugLabel + " post-parsing: ");
console.log(value);
}
return value;
},
getFieldsetByAlias: function (fieldsets, alias)
{
return _.find(fieldsets, function(fieldset){
return fieldset.alias == alias;
});
},
getPropertyIndexByAlias: function(properties, alias){
for (var i in properties)
{
if (properties[i].alias == alias) {
return i;
}
}
},
getPropertyByAlias: function (fieldset, alias){
return _.find(fieldset.properties, function(property){
return property.alias == alias;
});
},
getUniquePropertyAlias: function (currentScope, propertyAliasParts) {
if (currentScope.hasOwnProperty('fieldsetIndex') && currentScope.hasOwnProperty('property') && currentScope.hasOwnProperty('propertyConfigIndex'))
{
var currentPropertyAlias = "f" + currentScope.fieldsetIndex + "-" + currentScope.property.alias + "-p" + currentScope.propertyConfigIndex;
propertyAliasParts.push(currentPropertyAlias);
}
else if (currentScope.hasOwnProperty('isPreValue')) // Crappy way to identify this is the umbraco property scope
{
var umbracoPropertyAlias = currentScope.$parent.$parent.property.alias; // Crappy way to get the umbraco host alias once we identify its scope
propertyAliasParts.push(umbracoPropertyAlias);
}
if (currentScope.$parent)
this.getUniquePropertyAlias(currentScope.$parent, propertyAliasParts);
return _.unique(propertyAliasParts).reverse().join("-");
},
getFieldset: function(scope) {
return scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex];
},
getFieldsetProperty: function (scope) {
return this.getFieldset(scope).properties[scope.renderModelPropertyIndex];
},
setFieldsetValidity: function (fieldset) {
// mark the entire fieldset as invalid if there are any invalid properties in the fieldset, otherwise mark it as valid
fieldset.isValid =
_.find(fieldset.properties, function (property) {
return property.isValid == false
}) == null;
},
validateProperty: function (fieldset, property, configFieldsetModel) {
var propertyConfig = this.getPropertyByAlias(configFieldsetModel, property.alias);
if (propertyConfig) {
// use property.value !== property.value to check for NaN values on numeric inputs
if (propertyConfig.required && (property.value == null || property.value === "" || property.value !== property.value)) {
property.isValid = false;
}
// issue 116: RegEx validate property value
// Only validate the property value if anything has been entered - RegEx is considered a supplement to "required".
if (property.isValid == true && propertyConfig.regEx && property.value) {
var regEx = new RegExp(propertyConfig.regEx);
if (regEx.test(property.value) == false) {
property.isValid = false;
}
}
}
this.setFieldsetValidity(fieldset);
},
// called when the value of any property in a fieldset changes
propertyValueChanged: function (fieldset, property) {
// it's the Umbraco way to hide the invalid state when altering an invalid property, even if the new value isn't valid either
property.isValid = true;
this.setFieldsetValidity(fieldset);
}
}
});
@@ -0,0 +1,29 @@
{{VERSION_HTML}}
<div class="umb-panel archetype-dialog archetypeConfig" ng-controller="ArchetypeConfigOptionsController">
<div class="umb-panel-body no-header with-footer umb-scrollable archetypeAdvancedOptions">
<h3><archetype-localize key="developer_options">Developer Options</archetype-localize></h3>
<div>
<label for="archetypeAdvancedOptionsDeepDatatypeRequest"><input type="checkbox" id="archetypeAdvancedOptionsDeepDatatypeRequest" ng-model="dialogData.model.enableDeepDatatypeRequests" /><archetype-localize key="deepDatatypeRequest">Enable Deep Datatype Requests?</archetype-localize><small><archetype-localize key="deepDatatypeRequestDescription">Allows for easier datatype interception at the cost of caching performance.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsDeveloperMode"><input type="checkbox" id="archetypeAdvancedOptionsDeveloperMode" ng-model="dialogData.model.developerMode" /><archetype-localize key="toggleDeveloperMode">Enable Developer Mode?</archetype-localize><small><archetype-localize key="toggleDeveloperModeDescription">Toggle Developer Mode</archetype-localize></small></label>
</div>
<div>
<label for="archetypeOverrideDefaultConverter"><input type="checkbox" id="archetypeOverrideDefaultConverter" ng-model="dialogData.model.overrideDefaultPropertyValueConverter" /><archetype-localize key="overrideDefaultConverter">Override Default Property Value Converter?</archetype-localize><small><archetype-localize key="overrideDefaultConverterDescription">Check this if you wish to use your own custom property value converter.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsConfigModel"><archetype-localize key="configModel">Config Model</archetype-localize><small><archetype-localize key="configModelDescription">Be careful editing the text below, it controls the schema for this archetype.</archetype-localize></small></label>
<textarea class="archetypeDeveloperModel" id="archetypeAdvancedOptionsConfigModel" ng-model="dialogData.model" ng-change="dialogData.modelChanged = true"></textarea>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<button class="btn" ng-click="apply()">
<archetype-localize key="button_close">Close</archetype-localize>
</button>
</div>
</div>
</div>
</div>
@@ -0,0 +1,65 @@
{{VERSION_HTML}}
<div class="umb-panel archetype-dialog archetypeConfig" ng-controller="ArchetypeConfigOptionsController">
<div class="umb-panel-body no-header with-footer umb-scrollable archetypeAdvancedOptions">
<h3><archetype-localize key="global_fieldset_options">Global Fieldset Options</archetype-localize></h3>
<div>
<label for="archetypeAdvancedOptionsStartWithAddButton"><input type="checkbox" id="archetypeAdvancedOptionsStartWithAddButton" ng-model="dialogData.model.startWithAddButton"/><archetype-localize key="startWithAddButton">Start With Add Button?</archetype-localize><small><archetype-localize key="startWithAddButtonDescription">Empty property shows an add button instead of providing a default fieldset.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsHideLabels"><input type="checkbox" id="archetypeAdvancedOptionsHideLabels" ng-model="dialogData.model.hidePropertyLabels"/><archetype-localize key="hidePropertyLabels">Hide Property Labels?</archetype-localize><small><archetype-localize key="hidePropertyLabelsDescription">Hides the property labels.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsCollapsing"><input type="checkbox" id="archetypeAdvancedOptionsCollapsing" ng-model="dialogData.model.enableCollapsing"/><archetype-localize key="enableCollapsing">Enable Collapsing?</archetype-localize><small><archetype-localize key="enableCollapsingDescription">Enable fieldset collapsing.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsMaxFieldsets"><archetype-localize key="maxFieldsets">Max Fieldsets</archetype-localize><small><archetype-localize key="maxFieldsetsDescription">How many Fieldsets are allowed? Entering '1' will disable the controls. Default is unlimited.</archetype-localize></small></label>
<input type="number" id="archetypeAdvancedOptionsMaxFieldsets" class="archetypeMaxFieldsets" ng-model="dialogData.model.maxFieldsets"/>
</div>
<h4><archetype-localize key="fieldsetControls">Fieldset controls</archetype-localize></h4>
<div>
<label for="archetypeAdvancedOptionsHideControls"><input type="checkbox" id="archetypeAdvancedOptionsHideControls" ng-model="dialogData.model.hideFieldsetControls"/><archetype-localize key="hideFieldsetControls">Hide Fieldset Controls?</archetype-localize><small><archetype-localize key="hideFieldsetControlsDescription">Hides the fieldset add/remove/sort controls.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsCloning"><input type="checkbox" id="archetypeAdvancedOptionsCloning" ng-model="dialogData.model.enableCloning"/><archetype-localize key="enableCloning">Enable Cloning?</archetype-localize><small><archetype-localize key="enableCloningDescription">Enable fieldset cloning.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsDisabling"><input type="checkbox" id="archetypeAdvancedOptionsDisabling" ng-model="dialogData.model.enableDisabling" /><archetype-localize key="enableDisabling">Enable Fieldset Disabling?</archetype-localize><small><archetype-localize key="enableDisablingDescription">Allows fieldsets to be individually enabled/disabled.</archetype-localize></small></label>
</div>
<div>
<label for="archetypeAdvancedOptionsPublishing"><input type="checkbox" id="archetypeAdvancedOptionsPublishing" ng-model="dialogData.model.enablePublishing" /><archetype-localize key="enablePublishing">Enable Fieldset Publishing?</archetype-localize><small><archetype-localize key="enablePublishingDescription">Allows fieldsets to be automatically published and/or unpublished.</archetype-localize></small></label>
</div>
<h4><archetype-localize key="multipleFieldsets">Multiple fieldsets</archetype-localize></h4>
<div>
<label for="archetypeAdvancedOptionsMultipleFieldsets"><input type="checkbox" id="archetypeAdvancedOptionsMultipleFieldsets" ng-model="dialogData.model.enableMultipleFieldsets"/><archetype-localize key="enableMultipleFieldsets">Enable Multiple Fieldsets?</archetype-localize><small><archetype-localize key="enableMultipleFieldsetsDescription">Allows multiple types of fieldsets within this archetype.</archetype-localize></small></label>
</div>
<div ng-show="dialogData.model.enableMultipleFieldsets">
<label><archetype-localize key="fieldsetGroups">Fieldset groups</archetype-localize></label>
<small><archetype-localize key="fieldsetGroupsDescription">If you have a lot of fieldsets to choose from, you may want to consider grouping them in the fieldset picker. Once you have created your groups here, a group picker will be displayed in the fieldset editor and you can assign your fieldsets to their respective groups.</archetype-localize></small>
<div class="archetypeFieldsetGroups">
<ul ui-sortable="sortableOptions" ng-model="dialogData.model.fieldsetGroups">
<li ng-repeat="fieldsetGroup in dialogData.model.fieldsetGroups">
<div>
<input id="archetypeFieldsetGroupName_{{$index}}" type="text" ng-model="fieldsetGroup.name" />
<i class="icon icon-delete" ng-click="removeFieldsetGroup($index)"></i>
<i class="icon icon-navigation handle" ng-show="dialogData.model.fieldsetGroups.length > 1"></i>
</div>
</li>
</ul>
<label ng-click="addFieldsetGroup($index)"><i class="icon icon-add"></i> <archetype-localize key="addFieldsetGroup">Add fieldset group</archetype-localize></label>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<button class="btn" ng-click="apply()">
<archetype-localize key="button_close">Close</archetype-localize>
</button>
</div>
</div>
</div>
</div>
+11 -61
View File
@@ -1,4 +1,8 @@
{{VERSION_HTML}}
<div class="archetypeConfig" ng-controller="Imulus.ArchetypeConfigController">
<h2 class="archetype-headline"><img src="../App_Plugins/Archetype/assets/logo_50.png"/>Archetype<small>{{dllVersion}}</small><a href="https://twitter.com/archetypekit" target="_blank"><img src="../App_Plugins/Archetype/assets/twitter.png"/></a></h2>
<p>At a minimum your Archetype needs at least one fieldset with at least one property. You can configure it to allow for multiple types of fieldsets within a single Archetype and you can even add another Archetype as a property. Please use the link below for the full manual:</p>
<p><a class="manual-link" href="https://github.com/kgiszewski/ArchetypeManual" target="_blank">Archetype Manual</a></p>
<ul class="archetypeFieldsets" ui-sortable="sortableOptions" ng-model="archetypeConfigRenderModel.fieldsets">
<li ng-repeat="fieldset in archetypeConfigRenderModel.fieldsets" ng-hide="fieldset.remove">
<div class="archetypeFieldsetWrapper" >
@@ -17,6 +21,10 @@
<label for="archetypeFieldAlias_{{$index}}"><archetype-localize key="alias">Alias</archetype-localize></label>
<input type="text" id="archetypeFieldAlias_{{$index}}" ng-model="fieldset.alias" on-keyup="markAliasDirty(this)" required/>
</div>
<div class="archetypeFieldsetOption" ng-show="archetypeConfigRenderModel.fieldsetGroups.length">
<label for="archetypeFieldsetGroup_{{$index}}"><archetype-localize key="fieldsetGroup">Group</archetype-localize></label>
<select id="archetypeFieldsetGroup_{{$index}}" ng-model="fieldset.group" ng-options="fieldsetGroup as fieldsetGroup.name for fieldsetGroup in archetypeConfigRenderModel.fieldsetGroups"></select>
</div>
<div class="archetypeFieldsetOption">
<label for="archetypeFieldLabelTemplate_{{$index}}"><archetype-localize key="labelTemplate">Label Template</archetype-localize></label>
<input type="text" id="archetypeFieldLabelTemplate_{{$index}}" ng-model="fieldset.labelTemplate" />
@@ -79,67 +87,9 @@
<div class="archetypeOptions">
<div>
<label for="archetypeOptionsToggle"><archetype-localize key="toggleAdvanced">Toggle Advanced Options</archetype-localize><small><archetype-localize key="toggleAdvancedDescription">Show advanced options.</archetype-localize></small></label>
<input type="checkbox" id="archetypeOptionsToggle" ng-model="archetypeConfigRenderModel.showAdvancedOptions"/>
</div>
</div>
<div class="archetypeAdvancedOptions" ng-show="archetypeConfigRenderModel.showAdvancedOptions">
<div>
<label for="archetypeAdvancedOptionsStartWithAddButton"><archetype-localize key="startWithAddButton">Start With Add Button?</archetype-localize><small><archetype-localize key="startWithAddButtonDescription">Empty property shows an add button instead of providing a default fieldset.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsStartWithAddButton" ng-model="archetypeConfigRenderModel.startWithAddButton"/>
</div>
<div>
<label for="archetypeAdvancedOptionsHideControls"><archetype-localize key="hideFieldsetControls">Hide Fieldset Controls?</archetype-localize><small><archetype-localize key="hideFieldsetControlsDescription">Hides the fieldset add/remove/sort controls.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsHideControls" ng-model="archetypeConfigRenderModel.hideFieldsetControls"/>
</div>
<div>
<label for="archetypeAdvancedOptionsHideLabels"><archetype-localize key="hidePropertyLabels">Hide Property Labels?</archetype-localize><small><archetype-localize key="hidePropertyLabelsDescription">Hides the property labels.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsHideLabels" ng-model="archetypeConfigRenderModel.hidePropertyLabels"/>
</div>
<div>
<label for="archetypeAdvancedOptionsMaxFieldsets"><archetype-localize key="maxFieldsets">Max Fieldsets</archetype-localize><small><archetype-localize key="maxFieldsetsDescription">How many Fieldsets are allowed? Entering '1' will disable the controls. Default is unlimited.</archetype-localize></small></label>
<input type="number" id="archetypeAdvancedOptionsMaxFieldsets" class="archetypeMaxFieldsets" ng-model="archetypeConfigRenderModel.maxFieldsets"/>
</div>
<div>
<label for="archetypeAdvancedOptionsMultipleFieldsets"><archetype-localize key="enableMultipleFieldsets">Enable Multiple Fieldsets?</archetype-localize><small><archetype-localize key="enableMultipleFieldsetsDescription">Allows multiple types of fieldsets within this archetype.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsMultipleFieldsets" ng-model="archetypeConfigRenderModel.enableMultipleFieldsets"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCollapsing"><archetype-localize key="enableCollapsing">Enable Collapsing?</archetype-localize><small><archetype-localize key="enableCollapsingDescription">Enable fieldset collapsing.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsCollapsing" ng-model="archetypeConfigRenderModel.enableCollapsing"/>
</div>
<div>
<label for="archetypeAdvancedOptionsDisabling"><archetype-localize key="enableDisabling">Enable Fieldset Disabling?</archetype-localize><small><archetype-localize key="enableDisablingDescription">Allows fieldsets to be individually enabled/disabled.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsDisabling" ng-model="archetypeConfigRenderModel.enableDisabling" />
</div>
<div>
<label for="archetypeAdvancedOptionsFieldsetToolbar"><archetype-localize key="hideFieldsetToolbar">Hide Fieldset Toolbar?</archetype-localize><small><archetype-localize key="hideFieldsetToolbarDescription">Hides the fieldset toolbar that appears when more than one fieldset model appears.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsFieldsetToolbar" ng-model="archetypeConfigRenderModel.hideFieldsetToolbar"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCustomClass"><archetype-localize key="customWrapperClass">Custom Wrapper Class</archetype-localize><small><archetype-localize key="customWrapperClassDescription">(Optional) Enter a custom CSS class that will be applied to the wrapper div.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomClass" ng-model="archetypeConfigRenderModel.customCssClass"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCustomCss"><archetype-localize key="cssFile">CSS File</archetype-localize><small><archetype-localize key="cssFileDescription">(Optional) Enter a path for a custom CSS file to be included on the page.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomCss" ng-model="archetypeConfigRenderModel.customCssPath"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCustomJs"><archetype-localize key="jsFile">JS File</archetype-localize><small><archetype-localize key="jsFileDescription">(Optional) Enter a path for a custom JS file to be included on the page.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomJs" ng-model="archetypeConfigRenderModel.customJsPath"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCustomView"><archetype-localize key="viewFile">View File</archetype-localize><small><archetype-localize key="viewFileDescription">(Optional) Enter a path for a custom view file to be used to render this Archetype.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomView" ng-model="archetypeConfigRenderModel.customViewPath"/>
</div>
<div>
<label for="archetypeAdvancedOptionsDeveloperMode"><archetype-localize key="toggleDeveloperMode">Toggle Developer Mode</archetype-localize><small><archetype-localize key="toggleDeveloperModeDescription">Toggle Developer Mode</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsDeveloperMode" ng-model="archetypeConfigRenderModel.developerMode"/>
</div>
<div>
<label for="archetypeAdvancedOptionsConfigModel"><archetype-localize key="configModel">Config Model</archetype-localize><small><archetype-localize key="configModelDescription">Be careful editing the text below, it controls the schema for this archetype.</archetype-localize></small></label>
<textarea class="archetypeDeveloperModel" id="archetypeAdvancedOptionsConfigModel" ng-model="archetypeConfigRenderModel"></textarea>
<button class="btn btn-default" ng-click="showOptions($event, '../App_Plugins/archetype/views/archetype.config.fieldset.dialog.html')"><archetype-localize key="global_fieldset_options">Global Fieldset Options</archetype-localize></button>
<button class="btn btn-default" ng-click="showOptions($event, '../App_Plugins/archetype/views/archetype.config.stylescript.dialog.html')"><archetype-localize key="custom_style_script_options">Custom Style/Script Options</archetype-localize></button>
<button class="btn btn-default" ng-click="showOptions($event, '../App_Plugins/archetype/views/archetype.config.developer.dialog.html')"><archetype-localize key="developer_options">Developer Options</archetype-localize></button>
</div>
</div>
</div>
@@ -0,0 +1,31 @@
{{VERSION_HTML}}
<div class="umb-panel archetype-dialog archetypeConfig" ng-controller="ArchetypeConfigOptionsController">
<div class="umb-panel-body no-header with-footer umb-scrollable archetypeAdvancedOptions">
<h3><archetype-localize key="custom_style_script_options">Custom Style/Script Options</archetype-localize></h3>
<div>
<label for="archetypeAdvancedOptionsCustomClass"><archetype-localize key="customWrapperClass">Custom Wrapper Class</archetype-localize><small><archetype-localize key="customWrapperClassDescription">(Optional) Enter a custom CSS class that will be applied to the wrapper div.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomClass" ng-model="dialogData.model.customCssClass"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCustomCss"><archetype-localize key="cssFile">CSS File</archetype-localize><small><archetype-localize key="cssFileDescription">(Optional) Enter a path for a custom CSS file to be included on the page.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomCss" ng-model="dialogData.model.customCssPath"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCustomJs"><archetype-localize key="jsFile">JS File</archetype-localize><small><archetype-localize key="jsFileDescription">(Optional) Enter a path for a custom JS file to be included on the page.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomJs" ng-model="dialogData.model.customJsPath"/>
</div>
<div>
<label for="archetypeAdvancedOptionsCustomView"><archetype-localize key="viewFile">View File</archetype-localize><small><archetype-localize key="viewFileDescription">(Optional) Enter a path for a custom view file to be used to render this Archetype.</archetype-localize></small></label>
<input type="text" id="archetypeAdvancedOptionsCustomView" ng-model="dialogData.model.customViewPath"/>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<button class="btn" ng-click="apply()">
<archetype-localize key="button_close">Close</archetype-localize>
</button>
</div>
</div>
</div>
</div>
+75 -30
View File
@@ -1,36 +1,30 @@
{{VERSION_HTML}}
<div class="archetypeEditor ng-class:model.config.customCssClass">
<textarea class="archetypeDeveloperModel" ng-show="model.config.developerMode" ng-model="model.value"></textarea>
<ul ui-sortable="sortableOptions" ng-model="model.value.fieldsets" ng-show="!showAddButton()">
<li ng-repeat="fieldset in model.value.fieldsets">
<fieldset ng-class="[fieldset.alias, (getFieldsetValidity(fieldset) == false ? 'archetypeFieldsetError' : '')]" ng-init="fieldsetConfigModel = getConfigFieldsetByAlias(fieldset.alias)">
<fieldset ng-class="['archetype-fieldset-' + fieldset.alias, (getFieldsetValidity(fieldset) == false ? 'archetypeFieldsetError' : '')]" ng-init="fieldsetConfigModel = getConfigFieldsetByAlias(fieldset.alias)">
<div class="archetypeFieldsetLabel" ng-class="{enableCollapsing: model.config.enableCollapsing}">
<div ng-click="focusFieldset(fieldset)" class="label-sub module-label">
<span class="caret" ng-hide="fieldset.collapse || !model.config.enableCollapsing"></span>
<span class="caret caret-right" ng-show="fieldset.collapse && model.config.enableCollapsing"></span>
<label ng-class="{dimmed: fieldset.disabled}">
<span class="caret" ng-class="{'caret-right': isCollapsed(fieldset)}" ng-show="model.config.enableCollapsing"></span>
<label ng-class="{dimmed: isDisabled(fieldset)}">
<i class="fieldsetIcon icon ng-class:fieldsetConfigModel.icon"></i>
<span ng-bind="getFieldsetTitle(fieldsetConfigModel, $index)"></span>
</label>
</div>
<div class="archetypeEditorControls label-sub" ng-hide="model.config.hideFieldsetControls">
<i class="icon icon-add dropdown-toggle" ng-show="canAdd()" data-toggle="{{ model.config.fieldsets.length > 1 ? 'dropdown' : ''}}" ng-click="model.config.fieldsets.length == 1 ? addRow(fieldset.alias, $index) : return"></i>
<ul class="dropdown-menu umb-actions">
<li ng-repeat="fieldsetModel in model.config.fieldsets" ng-click="addRow(fieldsetModel.alias, $parent.$index)">
<a>
<i class="fieldsetIcon icon ng-class:fieldsetModel.icon"></i>
<span class="menu-label">{{fieldsetModel.label}}</span>
</a>
</li>
</ul>
<i class="icon icon-remove" ng-click="removeRow($index)" ng-show="canRemove()"></i>
<i class="icon icon-power" ng-class="{dimmed: fieldset.disabled}" ng-click="enableDisable(fieldset)" ng-show="canDisable()"></i>
<i class="icon icon-add" ng-show="canAdd()" ng-click="openFieldsetPicker($index, $event)"></i>
<i class="icon icon-navigation handle" ng-show="canSort()"></i>
<i class="icon icon-documents" ng-click="cloneRow($index)" ng-show="canClone()"></i>
<i class="icon icon-power" ng-class="{'icon-active': fieldset.disabled}" ng-click="enableDisable(fieldset)" ng-show="showDisableIcon(fieldset)"></i>
<i class="icon icon-time icon-disabled" ng-class="{'icon-active': isDisabledByPublishing(fieldset)}" ng-show="showPublishingIcon(fieldset)"></i>
<i class="icon icon-delete" ng-click="removeRow($index)" ng-show="canRemove()"></i>
</div>
</div>
<div class="archetypeCollapser animate-hide" ng-hide="isCollapsed(fieldset)">
<div class="archetypeCollapser animate-hide" ng-hide="model.config.enableCollapsing && isCollapsed(fieldset)" ng-if="isLoaded(fieldset)">
<form class="form-inline">
<div ng-class="[property.alias, (getPropertyValidity($parent.$index, property.alias) === false ? 'archetypePropertyError' : '')]" class="archetypeProperty control-group" ng-repeat="property in fieldsetConfigModel.properties">
<label ng-hide="model.config.hidePropertyLabels == '1'" class="control-label" for="archetype-property-{{model.alias}}-{{$parent.$index}}-{{$index}}">
<div ng-class="[('archetype-property-' + property.alias), (getPropertyValidity($parent.$index, property.alias) === false ? 'archetypePropertyError' : '')]" class="archetypeProperty control-group" ng-repeat="property in fieldsetConfigModel.properties">
<label ng-hide="model.config.hidePropertyLabels == '1'" class="control-label" for="archetype-property-{{model.alias}}-f{{$parent.$index}}-{{property.alias}}-p{{$index}}" ng-attr-title="{{ isDebuggingEnabled || model.config.developerMode ? property.alias : null }}">
<span>{{property.label}}</span>
<div class="archetypeFieldsetHelpText" ng-show="property.helpText">
<small>{{property.helpText}}</small>
@@ -38,7 +32,44 @@
</label>
<div ng-class="[(model.config.hidePropertyLabels == '1' ? 'controls-no-label' : 'controls')]">
<archetype-property class="archetypeEditor" property="property" fieldset-index="$parent.$index" fieldset="fieldset" archetype-config="model.config" property-config-index="$index" archetype-render-model="model.value" umbraco-form = "form"></archetype-property>
<archetype-property class="archetypeEditor" property="property" property-editor-alias="model.alias" fieldset-index="$parent.$index" fieldset="fieldset" archetype-config="model.config" property-config-index="$index" archetype-render-model="model.value" umbraco-form="form"></archetype-property>
<archetype-submit-watcher active-submit-watcher="activeSubmitWatcher" load-callback="submitWatcherOnLoad" submit-callback="submitWatcherOnSubmit"></archetype-submit-watcher>
</div>
</div>
<div class="control-group archetypeProperty settingsWrapper" ng-show="canConfigure()">
<div ng-click="showSettings = !showSettings" class="settingsHeader">
<span class="caret" ng-show="showSettings"></span>
<span class="caret caret-right" ng-hide="showSettings"></span>
<label>
<span><archetype-localize key="settings">Settings</archetype-localize></span>
</label>
</div>
<div class="settings" ng-show="showSettings">
<!-- misc fieldset settings go here -->
<div ng-if="fieldset.releaseDateModel" ng-show="canPublish()">
<label ng-hide="model.config.hidePropertyLabels == '1'" class="control-label">
<span><archetype-localize key="publish">Publishing</archetype-localize></span>
<div class="archetypeFieldsetHelpText">
<small><archetype-localize key="publishHelpText">Configure automatic publishing and/or unpublishing of this item</archetype-localize></small>
</div>
</label>
<div class="publishOptions" ng-class="[(model.config.hidePropertyLabels == '1' ? 'controls-no-label' : 'controls')]">
<div class="publishDate">
<label for="{{fieldset.releaseDateModel.alias}}">
<archetype-localize key="publishReleaseDate">Publish at</archetype-localize>
</label>
<umb-editor model="fieldset.releaseDateModel"></umb-editor>
</div>
<div class="publishDate">
<label for="{{fieldset.expireDateModel.alias}}">
<archetype-localize key="publishExpireDate">Unpublish at</archetype-localize>
</label>
<umb-editor model="fieldset.expireDateModel"></umb-editor>
</div>
<!-- we need a submit watcher here to make sure the publish dates are saved back to their models -->
<archetype-submit-watcher active-submit-watcher="activeSubmitWatcher" load-callback="submitWatcherOnLoad" submit-callback="submitWatcherOnSubmit"></archetype-submit-watcher>
</div>
</div>
</div>
</div>
</form>
@@ -47,17 +78,31 @@
</li>
</ul>
<div ng-show="showAddButton()">
<a data-toggle="{{ model.config.fieldsets.length > 1 ? 'dropdown' : ''}}" ng-click="model.config.fieldsets.length == 1 ? addRow(model.config.fieldsets[0].alias, 0) : return" prevent-default>
<i class="icon icon-add dropdown-toggle"></i>
<localize key="general_add" class="archetypeAddButtonText">Add</localize>
<a class="archetypeAddButton" ng-click="openFieldsetPicker(0, $event)" prevent-default>
<i class="icon icon-add"></i>
<archetype-localize key="addFieldset">Add an item</archetype-localize>
</a>
<ul class="dropdown-menu umb-actions">
<li ng-repeat="fieldsetModel in model.config.fieldsets" ng-click="addRow(fieldsetModel.alias, 0)">
<a>
<i class="fieldsetIcon icon ng-class:fieldsetModel.icon"></i>
<span class="menu-label">{{fieldsetModel.label}}</span>
</a>
</li>
</ul>
</div>
<div class="usky-grid fieldsetPicker" ng-class="{withGroups: overlayMenu.fieldsetGroups.length > 1}" ng-if="overlayMenu.show">
<div class="cell-tools-menu" ng-style="overlayMenu.style" delayed-mouseleave="closeFieldsetPicker()" archetype-click-outside="closeFieldsetPicker()">
<h5>
<archetype-localize key="addFieldset">Add an item</archetype-localize>
</h5>
<ul class="groups" ng-show="overlayMenu.fieldsetGroups.length > 1">
<li ng-repeat="fieldsetGroup in overlayMenu.fieldsetGroups" ng-class="{active: fieldsetGroup == overlayMenu.activeFieldsetGroup}">
<a ng-click="overlayMenu.activeFieldsetGroup = fieldsetGroup">
{{fieldsetGroup.name}}
</a>
</li>
</ul>
<ul class="elements">
<li ng-repeat="fieldset in overlayMenu.activeFieldsetGroup.fieldsets">
<a ng-click="pickFieldset(fieldset.alias, overlayMenu.index)" href>
<i class="icon {{fieldset.icon}}"></i>
{{fieldset.label}}
</a>
</li>
</ul>
</div>
</div>
</div>
+1
View File
@@ -1 +1,2 @@
{{VERSION_HTML}}
<div archetype-custom-view ng-controller="Imulus.ArchetypeController"></div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

+2 -2
View File
@@ -1,8 +1,8 @@
{
"name": "Archetype",
"version": "1.4.0-beta",
"version": "1.13.0",
"url": "http://github.com/imulus/archetype/",
"author": "Imulus",
"author": "Imulus - Kevin Giszewski - Tom Fulton - Lee Kelleher - Matt Brailsford - Kenn Jacobsen - Et. Al.",
"authorUrl": "http://imulus.com/",
"license": "MIT",
"licenseUrl": "http://opensource.org/licenses/MIT"
+15 -12
View File
@@ -1,15 +1,18 @@
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>Archetype</id>
<version><%= version %></version>
<title><%= name %></title>
<authors>imulus, kgiszewski, tomfulton</authors>
<owners>imulus, kgiszewski, tomfulton</owners>
<projectUrl>http://github.com/imulus/archetype</projectUrl>
<description><![CDATA[Archetype for Umbraco]]></description>
<tags>umbraco</tags>
<iconUrl>http://github.com/imulus/archetype/raw/master/assets/logo.png</iconUrl>
<licenseUrl><%= licenseUrl %></licenseUrl>
</metadata>
<metadata>
<id>Archetype</id>
<version><%= version %></version>
<title><%= name %></title>
<authors>imulus, kgiszewski, tomfulton</authors>
<owners>imulus, kgiszewski, tomfulton</owners>
<projectUrl>http://github.com/imulus/archetype</projectUrl>
<description><![CDATA[Archetype for Umbraco]]></description>
<tags>umbraco</tags>
<iconUrl>http://github.com/imulus/archetype/raw/master/assets/logo.png</iconUrl>
<licenseUrl><%= licenseUrl %></licenseUrl>
<dependencies>
<dependency id="Archetype.Binaries" version="<%= version %>" />
</dependencies>
</metadata>
</package>
-39
View File
@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<umbPackage>
<info>
<package>
<name><%= name %></name>
<version><%= version %></version>
<license url="<%= licenseUrl %>"><%= license %></license>
<url><%= url %></url>
<requirements>
<major>0</major>
<minor>0</minor>
<patch>0</patch>
</requirements>
</package>
<author>
<name><%= author %></name>
<website><%= authorUrl %></website>
</author>
<readme><![CDATA[<%= readmeContents %>]]></readme>
</info>
<DocumentTypes />
<Templates />
<Stylesheets />
<Macros />
<DictionaryItems />
<Languages />
<DataTypes />
<control />
<Actions />
<files>
<% files.forEach(function(file) { %>
<file>
<guid><%= file.guid %>.<%= file.ext %></guid>
<orgPath><%= file.dir %></orgPath>
<orgName><%= file.name %></orgName>
</file>
<% }); %>
</files>
</umbPackage>
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>Archetype.Binaries</id>
<version><%= version %></version>
<title><%= name %></title>
<authors>imulus, kgiszewski, tomfulton</authors>
<owners>imulus, kgiszewski, tomfulton</owners>
<projectUrl>http://github.com/imulus/archetype</projectUrl>
<description><![CDATA[Archetype binaries for Umbraco]]></description>
<tags>umbraco</tags>
<iconUrl>http://github.com/imulus/archetype/raw/master/assets/logo.png</iconUrl>
<licenseUrl><%= licenseUrl %></licenseUrl>
<dependencies>
<dependency id="UmbracoCms.Core" version="7.2.2" />
</dependencies>
</metadata>
</package>
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>Archetype.Courier</id>
<version><%= version %></version>
<title><%= name %></title>
<authors>leekelleher</authors>
<owners>kgiszewski, leekelleher</owners>
<projectUrl>http://github.com/imulus/archetype</projectUrl>
<description><![CDATA[Archetype Courier extension for Umbraco]]></description>
<tags>umbraco</tags>
<iconUrl>http://github.com/imulus/archetype/raw/master/assets/logo.png</iconUrl>
<licenseUrl><%= licenseUrl %></licenseUrl>
<dependencies>
<dependency id="Archetype.Binaries" version="<%= version %>" />
</dependencies>
</metadata>
</package>
+3 -2
View File
@@ -22,13 +22,14 @@
"grunt-msbuild": "~0.1.9",
"grunt-dotnet-assembly-info": "~1.0.9",
"load-grunt-tasks": "~0.4.0",
"grunt-umbraco-package": "0.0.5"
"grunt-umbraco-package": "^1.0.0"
},
"repository": {
"type": "git",
"url": "https://github.com/imulus/Archetype.git"
},
"devDependencies": {
"grunt-msbuild": "^0.1.12"
"grunt-msbuild": "^0.1.12",
"grunt-string-replace": "^1.2.0"
}
}