Compare commits

...

202 Commits

Author SHA1 Message Date
Kevin Giszewski 46613bbc01 Fix bug with Add button 2014-05-13 12:03:50 -04:00
Kevin Giszewski 4998acb59a Missing curlies from the conflict 2014-05-13 11:15:33 -04:00
Kevin Giszewski bc58078eec Merge branch 'develop'
Conflicts:
	app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs
	app/Umbraco/Umbraco.Archetype/Models/ArchetypeFieldsetModel.cs
	app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs
	app/Umbraco/Umbraco.Archetype/Models/ArchetypePropertyModel.cs
	app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs
2014-05-13 11:15:13 -04:00
Kevin Giszewski d1d95aebe7 Merge branch 'pr/126' into develop 2014-05-13 11:01:56 -04:00
kjac 1c9bce8b66 Explicitly set form as dirty on row changes
Fix issue #123. Explicitly call $setDirty() on the PE form when
reordering or removing rows, thus ensuring the editor will be prompted
to discard changes if navigating away before saving.
2014-05-12 21:51:19 +02:00
kjac 8d3e3aeb0a Stop Umbraco from asking to discard changes
By calling ngModelCtrl.$setViewValue() only when there's actually a
change in the value, we keep Umbraco from prompting to discard changes
immediately after all changes have been saved (see issue #121 for more
details).
2014-05-12 21:30:08 +02:00
kjac a58c0154c9 Merge remote-tracking branch 'upstream/master' 2014-05-12 19:11:08 +02:00
Kevin Giszewski 9829ab796a Remove setDirty()
- Not sure how it made it in
2014-05-12 19:09:29 +02:00
Kevin Giszewski 75080b0e2d Rename Model Files 2014-05-12 19:09:28 +02:00
Kevin Giszewski 932f098837 Expose current form to nested Archetypes 2014-05-12 19:09:28 +02:00
kjac 6e50301da5 Issue #116: Add RegEx validation support
Add RegEx validation for the individual properties in a fieldset as
proposed in issue #116
2014-05-12 19:09:27 +02:00
kjac 448bbe26f0 Update fix for issue #121 + fix issue #123
Use the built-in dirty state to handle row changes instead of the custom
state variable introduced in the previous commit.
Additionally this solves issue #123 by setting the dirty state when rows
are removed or sorted.
2014-05-12 19:09:26 +02:00
kjac 7c3c0e041d Fix issue #121
Stop prompting the editor to save unsaved changes after saving.
2014-05-12 19:09:26 +02:00
Kevin Giszewski 3b2559c37d Update folder name in sln 2014-05-12 19:09:25 +02:00
Kevin Giszewski 2cc4fd711a Update folder name 2014-05-12 19:09:24 +02:00
Kevin Giszewski d5038a52d1 Add in DatabaseSizer
- Temp DLL to not be included in dist
2014-05-12 19:09:24 +02:00
Kevin Giszewski d4cf60d5f3 Update packages to v7.1.2
- Also last commit
2014-05-12 19:09:23 +02:00
Kevin Giszewski 09a3172c80 Merge in 2014-05-12 19:09:22 +02:00
Kevin Giszewski 2bf2e5f91a Update naming scheme 2014-05-12 19:09:22 +02:00
Kevin Giszewski d09831b547 Merge pull request #125 from imulus/develop
Develop
2014-05-12 12:54:47 -04:00
Kevin Giszewski db82bd8013 Remove setDirty()
- Not sure how it made it in
2014-05-12 12:52:24 -04:00
Kevin Giszewski 4014583ade Merge branch 'pr/124' into develop 2014-05-12 12:45:45 -04:00
Kevin Giszewski 9a0e40b489 Rename Model Files 2014-05-12 12:44:18 -04:00
Kevin Giszewski 5c60c109d5 Expose current form to nested Archetypes 2014-05-12 12:43:38 -04:00
Kevin Giszewski 7615657a18 Rename Models
- Remove .Umbraco
2014-05-12 11:40:51 -04:00
Kevin Giszewski bdb3655418 Merge branch 'develop' into pr/124 2014-05-12 10:50:41 -04:00
Kevin Giszewski 0d766c1ad9 Merge branch 'develop' into pr/122 2014-05-12 09:55:54 -04:00
kjac e2c7e9b0ef Issue #116: Add RegEx validation support
Add RegEx validation for the individual properties in a fieldset as
proposed in issue #116
2014-05-11 10:39:12 +02:00
kjac 62964dcfae Update fix for issue #121 + fix issue #123
Use the built-in dirty state to handle row changes instead of the custom
state variable introduced in the previous commit.
Additionally this solves issue #123 by setting the dirty state when rows
are removed or sorted.
2014-05-10 22:29:56 +02:00
kjac a48033874a Fix issue #121
Stop prompting the editor to save unsaved changes after saving.
2014-05-10 17:25:16 +02:00
Kevin Giszewski ecb933d13a Update folder name in sln 2014-05-09 12:06:18 -04:00
Kevin Giszewski 45ccf6e06d Update folder name 2014-05-09 12:05:43 -04:00
Kevin Giszewski b0118f4bdb Add in DatabaseSizer
- Temp DLL to not be included in dist
2014-05-09 12:04:23 -04:00
Kevin Giszewski 7fd1b69e81 Update packages to v7.1.2
- Also last commit
2014-05-09 12:03:31 -04:00
Kevin Giszewski b67e150fe1 Merge in 2014-05-09 12:02:45 -04:00
kjac 5b43053406 Merge remote-tracking branch 'upstream/master' 2014-05-09 07:29:11 +02:00
Kevin Giszewski 1cbc192a9d Update naming scheme 2014-05-08 17:47:24 -04:00
Kevin Giszewski 4fff98640e Remove filter as .remove is no longer an attribute 2014-05-08 13:32:55 -04:00
Kevin Giszewski 085ff2cecf Add dropdown to add button 2014-05-08 13:32:04 -04:00
Kevin Giszewski d72a000d68 Remove Toolbar
- Fix insert index issue
2014-05-08 12:58:48 -04:00
Kevin Giszewski 2fc8845851 Merge branch 'master' into pr/115 2014-05-08 11:04:06 -04:00
leekelleher d5c6b4a324 Amended the build script to only copy the Archetype assembly. 2014-05-07 15:10:25 +01:00
leekelleher bd617162f1 Disabled "Copy Local" for 3rd-party assembly references. 2014-05-07 15:09:55 +01:00
kjac 06fdfc8226 Merge remote-tracking branch 'upstream/master' 2014-05-07 08:22:21 +02:00
Kevin Giszewski d4d50cae52 Merge branch 'master' of github.com:imulus/Archetype 2014-05-06 13:00:40 -04:00
Kevin Giszewski 688ad534f2 Check for config for label template 2014-05-06 13:00:05 -04:00
Tom Fulton ff39bce262 Add package task that creates both packages to simplify CI
Duplicated task steps to prevent needing to build multiple times but maintaining 'full build' in the individual package tasks
2014-05-05 17:36:26 +02:00
Kevin Giszewski 481259f0b7 Add try/catch with logging to prop converters 2014-05-05 17:36:26 +02:00
Tom Fulton 059d951a21 Don't use dropdown menu when only 1 fieldset type 2014-05-04 16:39:56 -06:00
Tom Fulton 6dc5841f31 Stylize dropdown menu 2014-05-04 16:21:19 -06:00
Tom Fulton 91fc5bbd7f Fix rows not being added in correct position 2014-05-04 15:59:01 -06:00
Tom Fulton 3742147cf7 Merge branch 'master' into feature/add-dropdown
Conflicts:
	app/views/archetype.html
2014-05-04 15:58:00 -06:00
Tom Fulton 432a33eef8 Add package task that creates both packages to simplify CI
Duplicated task steps to prevent needing to build multiple times but maintaining 'full build' in the individual package tasks
2014-05-03 00:32:18 -06:00
Kevin Giszewski b7a8f5f581 Add try/catch with logging to prop converters 2014-05-02 09:20:59 -04:00
kjac baa909d0c7 Merge remote-tracking branch 'upstream/master' 2014-04-30 18:45:07 +02:00
Kevin Giszewski 6ea44c271d Use a count on the add button rather than checking flag 2014-04-30 10:00:15 -04:00
kjac 7d4c27646f Merge remote-tracking branch 'upstream/master' 2014-04-30 08:39:04 +02:00
Tom Fulton 848d25a156 Show "remove" button when MaxFieldsets = 1 and Multiple Fieldset Types
... so the user can switch types (remove/add) when only a single row.

We check for Multiple Fieldset Types as well, because we don't want to show a "remove" button when there's only one type allowed (presumably).
2014-04-29 19:52:23 -06:00
Tom Fulton b4fc3e1cd3 Persist without formatting/whitespace 2014-04-29 18:34:25 -06:00
Tom Fulton 0547c4c07e Ensure we only save the "cleaned" model to the DB
* Extract the model cleaning logic to a method for re-use
* Call cleaning method from ConvertEditorToDb  (we were only calling on ConvertDbToString (cache))
* Update ConvertDbToEditor to route through new deserialization helper, so that it gets the "virtual" properties it needs that were lost in the cleaning
2014-04-29 18:18:14 -06:00
Kevin Giszewski 86f2f180bf Fix defaultPreValue import
- Remove MNTP hack
2014-04-29 16:23:55 -04:00
Kevin Giszewski 62a9ff05b9 Hide the Add button when multiple fieldsets enabled 2014-04-29 14:35:48 -04:00
Kevin Giszewski ce05dbb845 Remove logging 2014-04-29 14:25:34 -04:00
Kevin Giszewski 8ce8454620 Add a hack to make the MNTP multipicker work 2014-04-29 14:23:58 -04:00
Kevin Giszewski d13a5b1b86 Remove RenderModel
- Use server side converters for model cleanup
2014-04-29 12:31:02 -04:00
Tom Fulton 3b5cff8d9a Completely remove package.manifest in favor of C# declaration 2014-04-28 23:53:07 -06:00
Tom Fulton f214785cfa Merge branch 'wip/106-amend-3' into 106-update
Conflicts:
	app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs
2014-04-28 23:47:39 -06:00
Tom Fulton 61d0b67118 Merge branch '106' into 106-update
Conflicts:
	app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs
2014-04-28 23:46:51 -06:00
Tom Fulton 7a71afda0e GetValue - *always* check the PropertyValueConverters
Even if we want a string and the value is already a string, we should still hit the PropertyValueConverters for situations like the RTE's PVC, which performs parsing on the content.
2014-04-28 23:39:32 -06:00
Tom Fulton 4ad88a04e5 Misc cleanup 2014-04-28 23:37:39 -06:00
Tom Fulton 6f281080e8 Route new Convert* methods through Helper, refactor
This fixes the issue where the model sent to ConvertEditorToDb doesn't have a DataTypeGuid, thus we were unable to look up the correct PropertyEditor to run the Convert methods on.
2014-04-28 23:30:32 -06:00
kjac 00d2b693dd Merge remote-tracking branch 'upstream/master' 2014-04-28 09:52:00 +02:00
Tom Fulton bf76b80330 Make tests pass
Quick null check for PublishedPropertyType - we can't create a dummy one from a test due to some internal Umbraco dependencies, and we can't mock it as the relevant properties aren't virtual, so just adding a quick null check for now.
2014-04-28 09:41:57 +02:00
Tom Fulton 5d12f5f76c Mark helper methods internal for now 2014-04-28 09:41:57 +02:00
Tom Fulton 8deca35f24 Extract methods to retrieve metadata not stored in the model 2014-04-28 09:41:56 +02:00
Tom Fulton e628fa7af0 Move deserialization methods to a Helper class 2014-04-28 09:41:56 +02:00
Tom Fulton e2341e8bb5 Merge branch 'feature/rte-macro-fix' of github.com:mattbrailsford/Archetype into wip/106-amend-3
Conflicts:
	app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs
2014-04-27 23:07:26 -06:00
Tom Fulton 55bb2e49e5 Merge pull request #108 from imulus/pvc-refactor
Extract methods from ValueConverter for reuse
2014-04-27 22:55:15 -06:00
Tom Fulton ff4b5da163 Merge branch 'pvc-refactor' of github.com:imulus/Archetype into pvc-refactor 2014-04-24 23:12:05 -06:00
Tom Fulton ea017fa6cd Make tests pass
Quick null check for PublishedPropertyType - we can't create a dummy one from a test due to some internal Umbraco dependencies, and we can't mock it as the relevant properties aren't virtual, so just adding a quick null check for now.
2014-04-24 23:11:47 -06:00
Tom Fulton 7a29683008 Mark helper methods internal for now 2014-04-24 22:44:37 -06:00
Tom Fulton f52bbc2d0a Extract methods to retrieve metadata not stored in the model 2014-04-24 22:39:22 -06:00
Tom Fulton fa174ba15a Move deserialization methods to a Helper class 2014-04-24 22:29:58 -06:00
Tom Fulton a3a275808e Small refactorings to ConvertDataSource via @leekelleher
Manually merged in from: https://github.com/leekelleher/Archetype/blob/79bace6b882ec6bd291cc395be57336f8df26b0b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs
2014-04-24 22:05:52 -06:00
mattbrailsford 1ca8878592 Removed temp "ParseMacros" extension method
Removed package.manifest
Added C# property editor definition
Added initial code for handling data value conversions when accessing from / writing to datavabase / xml cache
2014-04-21 20:23:07 +01:00
Kevin Giszewski 5aeef0383c Bump dll version 2014-04-18 17:34:35 -04:00
Kevin Giszewski 337cd6d863 Bump the version to 1.0-beta 2014-04-18 17:33:39 -04:00
Kevin Giszewski 3160f8ce8f Use an extension to parse the RTE macros into rendered macros 2014-04-18 17:27:19 -04:00
Tom Fulton 5eed6da175 Fix clean path in build script 2014-04-15 23:40:17 -06:00
Kevin Giszewski da4383181c Bump the version number 2014-04-14 15:02:06 -04:00
Kevin Giszewski 25e8db9443 Update core refs to v7.1.1 2014-04-14 15:00:59 -04:00
Tom Fulton c6a47c0036 Merge pull request #100 from leekelleher/feature/grunt-vs-tidyup
Changed grunt "copy:dll" to take from "Release" directory
2014-04-13 22:22:53 -06:00
Kevin Giszewski 9795e26f1a Merge branch 'develop' of github.com:imulus/Archetype into develop 2014-04-10 16:48:34 -04:00
Kevin Giszewski e144e475b7 Merge pull request #101 from BatJan/patch-1
Translation to danish
2014-04-10 16:45:50 -04:00
BatJan 9c7cb43bb9 Translation to danish
...Have fun figuring out if my danish translation is good! (Just kidding!) :)
2014-04-10 22:42:45 +02:00
leekelleher ac20b370fb Amended the build script to take the assembly from the 'Release' directory.
Disabled "Copy Local" for 3rd-party assembly references.
2014-04-09 11:54:13 +01:00
Tom Fulton 6cc91e4359 Move cache keys to Constants 2014-04-04 17:09:42 -06:00
Tom Fulton c883afc81f Merge branch 'develop' into feature/clear-cache 2014-04-04 16:06:36 -06:00
Tom Fulton 3a89c73b6d Merge branch 'develop' 2014-04-04 15:57:04 -06:00
Tom Fulton 1eb0aa68d2 Wrap method in GetCacheItem - missed from merge conflict in 3ffd03e34c 2014-04-04 00:06:33 -06:00
Tom Fulton 533f7d9f8f DRY up DataTypeId lookups/caching 2014-04-04 00:04:03 -06:00
Tom Fulton 3ffd03e34c Merge branch '91' into feature/cache
Conflicts:
	app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs

Fix conflicts and update caching to match #91
2014-04-03 22:48:29 -06:00
Tom Fulton 91dcdae780 Merge branch 'develop' 2014-04-03 22:17:59 -06:00
Tom Fulton 15a242ab9b Clear the PreValue cache when DataTypes are saved 2014-04-03 22:14:41 -06:00
Kevin Giszewski 05b98beee6 Update README.md 2014-04-03 17:47:13 -04:00
Kevin Giszewski f138ee178b Remove reference to old config file 2014-04-03 13:50:01 -04:00
Kevin Giszewski 6e52df4f88 Update core references to 7.1.0 2014-04-03 13:47:52 -04:00
Kevin Giszewski 59aa67b89f Merge branch 'develop' into feature/discover-datatypes
Conflicts:
	app/Umbraco/Umbraco.Archetype/Api/ArchetypeDataTypeController.cs
2014-04-03 13:46:56 -04:00
Kevin Giszewski 7ddc74d75b Fix a glitch that won't let a single fieldset be removed if multiple FS's are configured with the 'Start with Add' option 2014-04-03 12:04:45 -04:00
Kevin Giszewski b53e3529b4 Merge branch 'develop' into pr/96 2014-04-03 11:45:43 -04:00
Kevin Giszewski e2e38646d1 Merge branch 'pr/94' into develop 2014-04-03 11:44:37 -04:00
Kevin Giszewski d7432d1f95 Update the GUID, seems to not default properly at times 2014-04-03 11:44:18 -04:00
Andrey Shchekin b9a0852c4f Added a "start with Add button" option that shows "+ Add" instead of default fieldset. 2014-04-02 14:26:35 +13:00
Tom Fulton 9d1850de97 Merge pull request #95 from imulus/fix/tests
Fix Fieldset tests
2014-03-30 20:10:20 -06:00
Tom Fulton 4a319b9ed4 Extract & Wrap PropertyValueConverter method to fix tests
Unable to access PropertyValueConverterResolver.Current from a test, so wrapping in a quick check for UmbracoContext.  Probably not the best fix, but wasn't sure best way or if overkill to create an abstraction.

Also extracted the logic that finds/executes PropertyValueConverters to make testing easier.
2014-03-30 20:05:43 -06:00
Tom Fulton 96aed2c256 WIP 2014-03-29 22:52:43 -06:00
Tom Fulton ddd01b4745 Update test to match new converter behavior (null -> empty Archetype) 2014-03-29 19:20:08 -06:00
Andrey Shchekin 3521543f17 Changed data types storage to store guids instead of ids. 2014-03-28 18:11:40 +13:00
mattbrailsford 6ce31efc27 Added caching to the datatype lookup to save database hits 2014-03-26 13:57:41 +00:00
Tom Fulton 342789e692 Merge branch 'develop' 2014-03-18 22:59:26 -06:00
Tom Fulton e87e84eb5b Explain build details in README 2014-03-18 22:59:06 -06:00
Tom Fulton 96b1839c04 Merge pull request #88 from leekelleher/feature/issues/87
Adds the "Enable Collapsing?" property to the `ArchetypePreValue` model.
2014-03-18 22:55:01 -06:00
Tom Fulton 73e8712ad8 Cleanup / update Gruntfile
* Use proper grunt-umbraco-package task
* Use new structure for --target, eliminate deploy step by making `dist` configurable
* Move package files to /config/
* Cleanup watch/copy tasks, add atBegin: true
* Prevent "cleaning" non-local destinations (dangerous?)
* Cleanup full/base path config
* Whitespace, misc
2014-03-18 22:50:11 -06:00
leekelleher 0830290bf1 Adds the "Enable Collapsing?" property to the ArchetypePreValue model.
Closes #87
2014-03-18 13:03:46 +00:00
Tom Fulton e374a9f01b Cleanup Gruntfile, streamline copy tasks
grunt watch:dev -> grunt watch
2014-03-17 19:04:10 -06:00
Tom Fulton 980752340e Merge branch 'develop' 2014-03-17 18:16:49 -06:00
Tom Fulton 5092a24dca Merge pull request #81 from imulus/tweak-pvc
Simplify PropertyValueConverter
2014-03-17 18:14:47 -06:00
Tom Fulton 9203718a95 Merge pull request #84 from imulus/feature/hide-label
Add "Hide Label" option for full-width Archetypes
2014-03-17 18:13:44 -06:00
Tom Fulton 63b47c8f9d Merge pull request #85 from imulus/feature/collapse-single
Allow single rows to be collapsed
2014-03-17 18:13:24 -06:00
Tom Fulton f3fd6f3676 Merge pull request #86 from leekelleher/feature/fieldset-methods-hasvalue
Added methods `HasProperty` and `HasValue`
2014-03-17 18:12:20 -06:00
leekelleher 504a3b5c04 Added methods HasProperty and HasValue
Added methods to the `Fieldset` object for checking if a property exists and/or if it has a value.
2014-03-17 15:04:52 +00:00
Tom Fulton 363e614349 Allow single rows to be collapsed
Previously, you couldn't collapse a single row by itself, it was always expanded.  Now you can collapse it, but it's still expanded on the initial page load.
2014-03-14 22:29:00 -06:00
Tom Fulton 35ea62dff1 Add "Hide Label" option for full-width Archetypes 2014-03-14 22:02:28 -06:00
Dillon 4879230303 Merge pull request #83 from imulus/feature/style-tweaks
Fix fieldset editor control styles
2014-03-14 17:37:45 -06:00
Dillon Morton 0a65c1a843 Fix repeater button bugs 2014-03-14 17:34:16 -06:00
Tom Fulton 30d0d11af0 Fix typo in label 2014-03-13 00:40:56 -06:00
Tom Fulton bb6a2d2f96 Use PropertyEditor Resolver in favor of static mapping file 2014-03-13 00:10:31 -06:00
Tom Fulton c5eced8a44 Tighten up validation checks, add back missing code
Fixes #79 by using ===
Fix for null values
2014-03-12 18:03:18 -06:00
Tom Fulton 512edaeaf9 Make Archetype Model enumerable to simplify usage, make Fieldsets internal 2014-03-12 17:36:15 -06:00
Tom Fulton dd453fc66a PVC: Return empty Archetype instead of null when empty/errors 2014-03-12 17:13:23 -06:00
Tom Fulton cc92cd23f4 Merge pull request #80 from imulus/fix/error-highlight
Fix Umbraco's error style propagating to elements in our view
2014-03-12 16:32:48 -06:00
Tom Fulton ac36b19399 Fix Umbraco's error style propagating to elements in our view 2014-03-12 16:29:38 -06:00
Tom Fulton 2a444260a4 Merge branch 'master' into develop 2014-03-12 16:21:59 -06:00
Tom Fulton 8e71e5b66e Merge pull request #76 from imulus/feature/bug-fixes-kg
Bug fixes
2014-03-12 16:10:36 -06:00
Tom Fulton d0ffd314e9 Ignore "removed" fieldsets earlier in validation 2014-03-12 16:09:54 -06:00
Tom Fulton 9abab522e6 Merge pull request #78 from leekelleher/feature-property-helptext-tag
Property's help text tag to match Umbraco style
2014-03-12 15:36:11 -06:00
leekelleher 99861275a8 Changed the property's help-text tag
from `<em>` to `<small>` - to match Umbraco's native style.
2014-03-12 20:11:54 +00:00
Kevin Giszewski fa54294d74 Bug fixes for:
- #75
2014-03-12 08:12:22 -04:00
Kevin Giszewski 92b2615e46 Update README.md 2014-03-10 13:49:01 -04:00
Tom Fulton 898790bfa6 Fix alignment of fieldset controls in Prevalue Editor 2014-03-06 12:18:28 -07:00
Tom Fulton d37ee132bc Update adding rows to adhere to new Enable Collapsing option 2014-03-06 12:15:51 -07:00
Tom Fulton 561ef8ccd0 Revert accidental(?) background-color change from eaf766c 2014-03-06 12:13:18 -07:00
Tom Fulton 45d7db0239 Add missing dependency 2014-03-06 12:12:40 -07:00
Tom Fulton e444b728b6 Merge branch 'develop' 2014-03-06 12:05:48 -07:00
Tom Fulton 5865b47482 Merge branch 'feature/allow-collapsing' into develop
Conflicts:
	app/controllers/controller.js
2014-03-06 12:05:34 -07:00
Tom Fulton 6248837b60 Merge pull request #58 from leekelleher/feature-patch-courier-dataresolver
Added a `DataTypeGuid` property to the `Property` object.
2014-03-06 12:03:04 -07:00
Tom Fulton 37f2de0a8f Merge pull request #70 from imulus/fix/view-loading
Add hack for #53 - attempt to resolve promises manually
2014-03-06 12:00:37 -07:00
Tom Fulton be15dba68a Merge pull request #72 from imulus/feature/auto-fill-alias
Auto-fill fieldset and property aliases in Config
2014-03-06 11:59:41 -07:00
Tom Fulton e2620892f5 Merge pull request #73 from imulus/fix-firefox-sort
Add hack to workaround U4-4181 (Firefox can't click any fields)
2014-03-06 11:59:15 -07:00
leekelleher 7879ae695e Exposed the internal members to the "Archetype.Courier" (and Test) assemblies. 2014-03-04 17:38:14 +00:00
leekelleher 50ced7459a Changed the Property properties to internal setters.
Made the `DataTypeGuid` property completely `internal`.
2014-03-04 17:37:09 +00:00
leekelleher 89af319265 Merge branch 'master' into feature-patch-courier-dataresolver 2014-03-04 17:25:19 +00:00
Tom Fulton 7505de1cf1 Add hack to workaround U4-4181 (Firefox can't click any fields)
...in lieu of "proper" fix in Umbraco.
2014-03-02 19:47:21 -07:00
Tom Fulton a09c69edc1 Auto-fill fieldset and property aliases in Config
* Add new aliasIsDirty property, init for existing data
* Bind label control's keyup to populate the `alias` property (when it's not dirty) using Umbraco's helpers
* Mark alias dirty on keyup
2014-03-02 18:43:12 -07:00
Tom Fulton 03101a128e Hide carets when collapsing is disabled 2014-03-02 00:48:49 -07:00
Tom Fulton 67c118066b Merge branch 'develop' into feature/allow-collapsing
Conflicts:
	app/views/archetype.html
2014-03-02 00:41:20 -07:00
Tom Fulton f49159d2d0 Add option to make "collapsing" feature optional
* View: Prevent collapse/expand depending on config option, add class when enabled
* Config: Add option to view, set default to enabled for new datatypes
* CSS: Revert to normal cursor when collapsing disabled

* Note, this is a breaking change - you'll need set `Enable Collapsing?` to `true` on any existing Archetypes to retain the behavior.
2014-03-02 00:38:34 -07:00
Tom Fulton 840feec967 Add hack for #53 - attempt to resolve promises manually
$compile no longer unwraps promises, meaning some property editors may not fully load (their various .then() methods never get executed).  This attempts to resolve them after a delay.  Could be intermittent, but seems to work in most cases.
2014-03-01 22:45:26 -07:00
Tom Smith ffc4eaa964 Merge pull request #67 from rtsmith/master
Make entire module label clickable and change remove icon
2014-02-27 17:23:26 -07:00
Thomas Smith eaf766c2a7 Make entire module label clickable and change remove icon 2014-02-27 17:15:02 -07:00
Tom Fulton 419180c443 Merge branch 'develop' 2014-02-27 14:44:55 -07:00
Tom Fulton e97c976c7f Merge branch 'master' of github.com:imulus/Archetype
Conflicts:
	app/Umbraco/Umbraco.Archetype/Properties/AssemblyInfo.cs
2014-02-27 14:29:51 -07:00
Tom Fulton 2d05e64e5a Merge branch 'develop' of github.com:imulus/Archetype into develop 2014-02-27 14:25:48 -07:00
Tom Fulton 6f4d7f9e9b Bump version 2014-02-27 14:20:49 -07:00
Tom Fulton 5a24e9b016 Merge pull request #62 from imulus/versioning
Add version # to DLL on build
2014-02-27 13:41:28 -07:00
Tom Fulton 4d4e9d7de0 Quick-fix issues with NuGet package paths 2014-02-27 13:38:07 -07:00
Kevin Giszewski 1dde1ed5f0 Add version to assembly 2014-02-26 10:01:39 -05:00
Kevin Giszewski 88051ef61d Bump Version Number 2014-02-26 09:41:06 -05:00
Kevin Giszewski 10d3dd76ed Fix a situation where null were getting into the model on save. 2014-02-26 09:39:02 -05:00
Kevin Giszewski b52f153141 Merge pull request #57 from imulus/feature/api
Expose the Datatype Service GetById
2014-02-26 08:09:27 -05:00
Tom Fulton 062f28f9ca Tighten up watch/deploy tasks
* Don't trigger watch on changes to the .NET solution (except *.dll)
* Include .pdb file for dev deployments
* Fix DLL copying to wrong paths
2014-02-24 01:00:08 -07:00
Tom Fulton cd2bd8c562 Add version # to DLL on build
* Split VersionInfo from AssemblyInfo so we can ignore changes and let the build handle
* Ignore VersionInfo
* Install/configure assemblyinfo grunt task
* Ignore compiler warning about bad version number format (.NET vs SemVer)
2014-02-22 00:32:37 -07:00
Tom Fulton ed6068230e Merge pull request #59 from leekelleher/patch-vs-housekeeping
Some Visual Studio housekeeping
2014-02-21 22:53:16 -07:00
Tom Fulton 24bfef64dd Misc housekeeping 2014-02-21 22:36:27 -07:00
Tom Fulton 1d5e4eda7e Trim down data returned from API 2014-02-21 22:34:30 -07:00
leekelleher 346b8c73d4 Tidied up the AssemblyInfo with your company details, etc. 2014-02-21 18:17:59 +00:00
leekelleher 43ea29cdf2 Set the assembly references not to all "Copy Local",
so that everything isn't copied over to the /bin folders.
2014-02-21 18:14:13 +00:00
leekelleher de03a12e9c Added a DataTypeGuid property to the Property object.
This is required for Courier's DataResolver to "hot-swap" the DataTypeId (int) with it's unique Id (Guid).
2014-02-21 18:05:53 +00:00
Kevin Giszewski f05a67d9d2 Expose the Datatype Service GetById 2014-02-20 11:07:20 -05:00
Kevin Giszewski 3ac7ef34ec Merge pull request #54 from imulus/develop
Develop
2014-02-19 09:17:17 -05:00
Kevin Giszewski 518f95ce01 Merge pull request #52 from imulus/fix-ids
Fix some datatypes not working with multiple Archetypes
2014-02-19 09:16:41 -05:00
Tom Fulton 7831e476e3 Ensure property containers use unique IDs with multiple fieldsets
...by adding the current Archetype's Umbraco Property Alias to the ID string

Old: archetype-property-0-0
New: archetype-property-sliderItems-0-0

Need to DRY this up later ;)
2014-02-17 15:17:57 -07:00
Kevin Giszewski bfb883c098 Merge pull request #49 from leekelleher/feature-patch-courier-dataresolver
Tweaks to support a Courier DataResolver
2014-02-14 09:29:57 -05:00
leekelleher bbe3506747 Housekeeping: Fixed up the whitespace :bowtie:
There was a mix of tabs & spaces...
... normalized to use spaces (which was painful for me as I'm a "tabs kinda guy" 🤘
2014-02-13 17:50:07 +00:00
leekelleher 42743b1394 Fleshed out the ArchetypePreValue models.
(When Courier packages up the DataTypeDefinition - we need to serialize/deserialize the config options/JSON)
2014-02-13 17:43:52 +00:00
leekelleher 9a712acd6a Added constant for the prevalue alias.
(As we reference to this in the Courier DataResolver)
2014-02-13 17:30:28 +00:00
leekelleher 4c8bbd5d8f Added a nested try/catch.
For if the `PublishedPropertyType` value is null, we can still get an `Archetype` model returned)
2014-02-13 16:53:38 +00:00
leekelleher 9296388abe Added a constant for the PropertyEditor alias.
(So that we can reference it from the Courier DataResolver, without fear of typos)
2014-02-13 16:51:31 +00:00
leekelleher 3c5e2013a0 Added JsonProperty attributes to the properties.
(So that we can serialize/deserialize from the Courier DataResolver)
2014-02-13 16:32:03 +00:00
leekelleher aacbc06992 Changed the Property.DataTypeId property to be public, with an internal setter.
(We need to reference it within Courier's DataResolver)
2014-02-13 16:27:29 +00:00
leekelleher 220a034d2a Changed the Property.Value setter to be public. 2014-02-13 14:16:42 +00:00
Kevin Giszewski 6317b83720 Remove legacy filter 2014-02-07 17:31:18 -05:00
68 changed files with 2027 additions and 1067 deletions
+2 -1
View File
@@ -13,7 +13,7 @@ $RECYCLE.BIN/
app/less/*.css
dist/
node_modules/
pkg/tmp/
tmp/
pkg/*.nupkg
pkg/*.zip
@@ -23,6 +23,7 @@ pkg/*.zip
[Bb]in/
[Oo]bj/
[Pp]ackages/
VersionInfo.cs
*.aps
*.bak
+182 -173
View File
@@ -1,38 +1,181 @@
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
var path = require('path')
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
pkgMeta: grunt.file.readJSON('pkg/meta.json'),
dest: 'dist',
package_dir: 'pkg',
package_temp_dir: '<%= package_dir %>/tmp/',
pkgMeta: grunt.file.readJSON('config/meta.json'),
dest: grunt.option('target') || 'dist',
basePath: path.join('<%= dest %>', 'App_Plugins', '<%= pkgMeta.name %>'),
watch: {
options: {
spawn: false,
atBegin: true
},
less: {
files: ['app/less/*.less', 'lib/**/*.less'],
tasks: ['less:build'],
options: {
spawn: false
}
files: ['app/**/*.less'],
tasks: ['less:dist']
},
js: {
files: ['app/**/*.js', 'lib/**/*.js'],
tasks: ['concat', 'jshint'],
options: {
spawn: false
}
files: ['app/**/*.js'],
tasks: ['concat:dist']
},
dev: {
files: ['app/**'],
tasks: ['deploy'],
html: {
files: ['app/**/*.html'],
tasks: ['copy:html']
},
dll: {
files: ['app/Umbraco/**/*.dll'],
tasks: ['copy:dll']
}
},
less: {
dist: {
options: {
spawn: false
paths: ["app/less", "lib/less", "vendor"],
},
files: {
'<%= basePath %>/css/archetype.css': 'app/less/archetype.less',
}
}
},
concat: {
options: {
stripBanners: false
},
dist: {
src: [
'app/controllers/controller.js',
'app/controllers/config.controller.js',
'app/directives/archetypeproperty.js',
'app/directives/localize.js',
'app/services/localization.js',
'app/resources/propertyeditor.js'
],
dest: '<%= basePath %>/js/archetype.js'
}
},
copy: {
html: {
cwd: 'app/views/',
src: ['archetype.html', 'archetype.config.html'],
dest: '<%= basePath %>/views',
expand: true
},
dll: {
cwd: 'app/Umbraco/Umbraco.Archetype/bin/Release/',
src: 'Archetype.dll',
dest: '<%= dest %>/bin/',
expand: true
},
config: {
files: [
{
cwd: 'app/langs/',
src: ['**'],
dest: '<%= basePath %>/langs',
expand: true
}
]
},
nuget: {
files: [
{
cwd: '<%= dest %>',
src: ['**/*', '!bin', '!bin/*'],
dest: 'tmp/nuget/content',
expand: true
},
{
cwd: '<%= dest %>/bin',
src: ['*.dll'],
dest: 'tmp/nuget/lib/net40',
expand: true
}
]
},
umbraco: {
cwd: '<%= dest %>',
src: '**/*',
dest: 'tmp/umbraco',
expand: true
}
},
nugetpack: {
dist: {
src: 'tmp/nuget/package.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']
}
}
},
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',
}
},
clean: {
build: '<%= grunt.config("basePath").substring(0, 4) == "dist" ? "dist/**/*" : "null" %>',
tmp: ['tmp']
},
assemblyinfo: {
options: {
files: ['app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj'],
filename: 'VersionInfo.cs',
info: {
version: '<%= (pkgMeta.version.indexOf("-") ? pkgMeta.version.substring(0, pkgMeta.version.indexOf("-")) : pkgMeta.version) %>',
fileVersion: '<%= pkgMeta.version %>'
}
}
},
touch: {
webconfig: {
src: ['<%= grunt.option("target") %>\\Web.config']
}
},
jshint: {
options: {
jshintrc: '.jshintrc'
@@ -42,164 +185,30 @@ module.exports = function(grunt) {
}
},
less: {
build: {
options: {
paths: ["app/less", "lib/less", "vendor"],
},
files: {
'<%= dest %>/css/archetype.css': 'app/less/archetype.less',
}
}
},
concat: {
options: {
stripBanners: false
},
application: {
src: [
'app/controllers/controller.js',
'app/controllers/config.controller.js',
'app/directives/archetypeproperty.js',
'app/directives/localize.js',
'app/services/localization.js',
'app/resources/propertyeditor.js'
],
dest: '<%= dest %>/js/archetype.js'
}
},
nugetpack: {
dist: {
src: '<%= package_temp_dir %>/nuget/package.nuspec',
dest: '<%= package_dir %>'
}
},
template: {
'nuget_manifest': {
'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: '..\\..\\..\\<%= dest %>\\**', target: 'content\\App_Plugins\\Archetype'}]
}
},
'files': {
'<%= package_temp_dir %>/nuget/package.nuspec': ['<%= package_dir %>/nuget/package.nuspec']
}
}
},
clean: {
build: ['<%= dest %>']
},
copy: {
build: {
files: [
{expand: true, cwd: 'app/', src: ['package.manifest'], dest: '<%= dest %>', flatten: true},
{expand: true, cwd: 'app/views/', src: ['archetype.html', 'archetype.config.html'], dest: '<%= dest %>/views', flatten: true},
{expand: true, cwd: 'app/config/', src: ['propertyEditors.views.js'], dest: '<%= dest %>/js', flatten: true},
{expand: true, cwd: 'app/langs/', src: ['**'], dest: '<%= dest %>/langs', flatten: true},
{expand: true, cwd: 'app/Umbraco/Umbraco.Archetype/bin/Debug/', src: ['Archetype.dll'], dest: '<%= dest %>/bin', flatten: true}
]
},
deploy: {
files: [
{expand: true, cwd: '<%= dest %>/', src: ['**/*', '!bin/*'], dest: '<%= grunt.option("target") %>\\App_Plugins\\Archetype', flatten: false},
{expand: true, cwd: '<%= dest %>/', src: ['bin/*'], dest: '<%= grunt.option("target") %>\\bin', flatten: false},
]
},
nuget_prepare: {
files: [
{expand: true, cwd: '<%= dest %>/', src: ['**/*', '!bin/*'], dest: '<%= package_temp_dir %>/nuget/content/', flatten: false},
{expand: true, cwd: '<%= dest %>/', src: ['bin/*'], dest: '<%= package_temp_dir %>/nuget/lib/net40/', flatten: false}
]
},
umbracopackage: {
files: [
{expand: true, cwd: '<%= dest %>/', src: ['**/*', "!bin/*"], dest: 'pkg/tmp/umbraco/App_Plugins/Archetype', flatten: false},
{expand: true, cwd: '<%= dest %>/', src: ['bin/*'], dest: 'pkg/tmp/umbraco', flatten: false}
]
}
},
touch: {
options: {},
webconfig: {
src: ['<%= grunt.option("target") %>\\Web.config']
}
},
umbracoPackage: {
options: {
name: "<%= pkgMeta.name %>",
version: '<%= pkgMeta.version %>',
url: '<%= pkgMeta.url %>',
license: '<%= pkgMeta.license %>',
licenseUrl: '<%= pkgMeta.licenseUrl %>',
author: '<%= pkgMeta.author %>',
authorUrl: '<%= pkgMeta.authorUrl %>',
manifest: 'pkg/umbraco/package.xml',
readme: 'pkg/umbraco/readme.txt',
sourceDir: 'pkg/tmp/umbraco',
outputDir: 'pkg',
}
},
clean: {
build: ['<%= dest %>'],
package_temp: ['pkg/tmp'],
package_artifacts: ['pkg/*.zip', 'pkg/*.nupkg'],
},
msbuild: {
dev: {
src: ['app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj'],
options: {
projectConfiguration: 'Debug',
targets: ['Clean', 'Rebuild'],
stdout: true,
maxCpuCount: 4,
buildParameters: {
WarningLevel: 2
},
verbosity: 'quiet'
}
options: {
stdout: true,
verbosity: 'quiet',
maxCpuCount: 4,
buildParameters: {
WarningLevel: 2,
NoWarn: 1607
}
},
dist: {
src: ['app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj'],
options: {
projectConfiguration: 'Release',
targets: ['Clean', 'Rebuild'],
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-nuget');
grunt.loadNpmTasks('grunt-template');
grunt.loadNpmTasks('grunt-touch');
grunt.loadNpmTasks('grunt-msbuild');
grunt.loadTasks('tasks');
grunt.registerTask('package', ['clean:package_artifacts', 'default', 'package:nuget', 'package:umbraco']);
grunt.registerTask('package:nuget', ['copy:nuget_prepare', 'template:nuget_manifest', 'nugetpack', 'clean:package_temp']);
grunt.registerTask('package:umbraco', ['copy:umbracopackage', 'umbracoPackage', 'clean:package_temp']);
grunt.registerTask('touchwebconfigifenabled', function() { if (grunt.option("touch")) grunt.task.run("touch:webconfig") });
grunt.registerTask('deploy', ['default', 'copy:deploy', 'touchwebconfigifenabled']);
grunt.registerTask('css:build', ['less']);
grunt.registerTask('js:build', ['concat']);
grunt.registerTask('default', ['clean', 'css:build', 'js:build', 'copy:build', 'msbuild:dev']);
};
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']);
};
+11 -4
View File
@@ -1,5 +1,6 @@
Archetype
=========
![alt tag](http://imulus.github.io/Archetype/images/logo.png)
## 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>.
@@ -8,6 +9,8 @@ Install the selected <a href='https://github.com/imulus/Archetype/releases'>rele
## Official Docs ##
http://imulus.github.io/Archetype
Follow us on Twitter https://twitter.com/ArchetypeKit
## 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.
@@ -21,10 +24,14 @@ Want to contribute to Archetype? You'll want to use Grunt (our task runner) to
### Build ###
grunt
Builds the project to `/dist/`. These files can be dropped into an Umbraco 7 site, or you can build directly to a site using:
grunt --target="D:\inetpub\mysite"
You can also watch for changes using:
grunt watch
grunt watch --target="D:\inetpub\mysite"
### Deploy ###
grunt deploy --target=C:\\path\\to\\umbraco\\site
grunt watch:dev --target=C:\\path\to\\umbraco\\site
Add `--touch` to either command to automatically touch the web.config on a deploy
@@ -31,21 +31,191 @@
<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, Version=1.0.5242.22740, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<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, Version=1.0.5242.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
</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>
</Reference>
<Reference Include="CookComputing.XmlRpcV2">
<HintPath>..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll</HintPath>
</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>
</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, Version=1.9.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll</HintPath>
</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>
</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>
</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>
</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, Version=1.0.1559.20655, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
</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>
</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.1\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="Moq">
<HintPath>..\packages\Moq.4.2.1312.1622\lib\net40\Moq.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, 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>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
</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>
</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" />
<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.Net.Http.WebRequest" />
<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>
</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>
</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.30506.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">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll</HintPath>
<Private>True</Private>
</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.30506.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.30506.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.30506.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="Umbraco.Core">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\Umbraco.Core.dll</HintPath>
<Reference Include="TidyNet, Version=1.0.0.0, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -54,6 +224,7 @@
<Compile Include="PropertyValueConverter\PropertyValueConverterTests.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Data\sample-1.json" />
<None Include="packages.config" />
</ItemGroup>
@@ -4,7 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Archetype.Umbraco.PropertyConverters;
using Archetype.PropertyConverters;
using NUnit.Framework;
namespace Archetype.Tests.Models
@@ -26,7 +26,7 @@ namespace Archetype.Tests.Models
public void Can_Get_Fieldset_Property_By_Alias()
{
var converter = new ArchetypeValueConverter();
var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false);
var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false);
var fieldset = result.Fieldsets.First();
var propertyValue = fieldset.GetValue("boxHeadline");
@@ -38,7 +38,7 @@ namespace Archetype.Tests.Models
public void Can_Convert_Property_Value_Types()
{
var converter = new ArchetypeValueConverter();
var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false);
var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false);
var fieldset = result.Fieldsets.First();
@@ -51,7 +51,7 @@ namespace Archetype.Tests.Models
public void Returns_String_When_No_Type_Specified()
{
var converter = new ArchetypeValueConverter();
var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false);
var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false);
var fieldset = result.Fieldsets.First();
@@ -4,7 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Archetype.Umbraco.PropertyConverters;
using Archetype.PropertyConverters;
using Moq;
using NUnit.Framework;
using Umbraco.Core.Models.PublishedContent;
@@ -24,39 +24,37 @@ namespace Archetype.Tests.PropertyValueConverter
}
[Test]
public void Returns_Null_When_Data_Is_Null()
[TestCase(null)]
[TestCase("")]
public void Returns_Empty_Archetype_When_Data_Is_Null_Or_Empty(object data)
{
var converter = new ArchetypeValueConverter();
var result = converter.ConvertDataToSource(null, null, false);
Assert.IsNull(result);
}
[Test]
public void Returns_Empty_String_When_Data_Is_Empty_String()
{
var data = "";
var converter = new ArchetypeValueConverter();
var result = converter.ConvertDataToSource(null, data, false);
Assert.AreEqual("", result);
Assert.AreEqual(result.GetType(), typeof (Archetype.Models.ArchetypeModel));
var fieldsets = (Archetype.Models.ArchetypeModel) result;
Assert.IsTrue(fieldsets.Count() == 0);
}
[Test]
public void Returns_Original_String_When_Data_Is_Invalid_Json()
public void Returns_Empty_Archetype_When_Data_Is_Invalid_Json()
{
var data = "{ invalid";
var converter = new ArchetypeValueConverter();
var result = converter.ConvertDataToSource(null, data, false);
Assert.AreEqual(data, result);
Assert.AreEqual(result.GetType(), typeof (Archetype.Models.ArchetypeModel));
var fieldsets = (Archetype.Models.ArchetypeModel) result;
Assert.IsTrue(fieldsets.Count() == 0);
}
[Test]
public void Can_Serialize_From_Json_Model()
{
var converter = new ArchetypeValueConverter();
var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false);
var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false);
Assert.That(result != null);
Assert.That(result.Fieldsets.Count() == 2);
+27
View File
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<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>
<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>
</assemblyBinding>
</runtime>
</configuration>
@@ -1,5 +1,28 @@
<?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.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.1" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.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.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net45" />
<package id="Microsoft.Net.Http" 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="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="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>
+49
View File
@@ -0,0 +1,49 @@
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);
}
}
}
}
@@ -0,0 +1,213 @@
<?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>
@@ -0,0 +1,36 @@
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
@@ -0,0 +1,27 @@
<?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
@@ -0,0 +1,25 @@
<?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>
+6
View File
@@ -12,6 +12,8 @@ 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
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -26,6 +28,10 @@ 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
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -0,0 +1,42 @@
using System.Collections.Generic;
using System;
using System.Linq;
using System.Net;
using System.Web.Http;
using AutoMapper;
using Umbraco.Core.Models;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Web.Mvc;
using Umbraco.Web.Editors;
namespace Archetype.Api
{
[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});
}
public object GetAll()
{
var dataTypes = Services.DataTypeService.GetAllDataTypeDefinitions();
return dataTypes.Select(t => new { guid = t.Key, name = t.Name });
}
public object GetByGuid(Guid guid)
{
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 };
}
}
}
@@ -7,7 +7,7 @@
<ProjectGuid>{7D185D41-4228-4978-ACB8-83F9A48AD94F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Archetype.Umbraco</RootNamespace>
<RootNamespace>Archetype</RootNamespace>
<AssemblyName>Archetype</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
@@ -34,114 +34,136 @@
<ItemGroup>
<Reference Include="AutoMapper">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AutoMapper.Net4">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="businesslogic">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\businesslogic.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll</HintPath>
</Reference>
<Reference Include="ClientDependency.Core">
<HintPath>..\packages\ClientDependency.1.7.0.4\lib\ClientDependency.Core.dll</HintPath>
<HintPath>..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ClientDependency.Core.Mvc">
<HintPath>..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="cms">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\cms.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
</Reference>
<Reference Include="controls">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\controls.dll</HintPath>
<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>
<Private>False</Private>
</Reference>
<Reference Include="Examine">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\Examine.dll</HintPath>
<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>
<Private>False</Private>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
<Private>False</Private>
</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.0.1\lib\interfaces.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\log4net.dll</HintPath>
<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>
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Helpers">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\Microsoft.Web.Helpers.dll</HintPath>
<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>
<Private>False</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.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="MiniProfiler">
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SQLCE4Umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\SQLCE4Umbraco.dll</HintPath>
<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.0.1\lib\System.Data.SqlServerCe.dll</HintPath>
<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.0.1\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
</Reference>
<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>False</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>
<Private>False</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>False</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>False</Private>
</Reference>
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.30506.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>
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.2.0.30506.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>
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.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>
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.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>
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
@@ -150,51 +172,58 @@
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="TidyNet">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\TidyNet.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
</Reference>
<Reference Include="umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\umbraco.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Core">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\Umbraco.Core.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll</HintPath>
</Reference>
<Reference Include="umbraco.DataLayer">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\umbraco.DataLayer.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll</HintPath>
</Reference>
<Reference Include="umbraco.editorControls">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\umbraco.editorControls.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll</HintPath>
</Reference>
<Reference Include="umbraco.MacroEngines">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\umbraco.MacroEngines.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll</HintPath>
</Reference>
<Reference Include="umbraco.providers">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\umbraco.providers.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Web.UI">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\Umbraco.Web.UI.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll</HintPath>
</Reference>
<Reference Include="umbraco.XmlSerializers">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\umbraco.XmlSerializers.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll</HintPath>
</Reference>
<Reference Include="UmbracoExamine">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\UmbracoExamine.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll</HintPath>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter">
<HintPath>..\packages\UmbracoCms.Core.7.0.1\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Api\ArchetypeDataTypeController.cs" />
<Compile Include="Constants.cs" />
<Compile Include="Events\ExpireCache.cs" />
<Compile Include="Extensions\ArchetypeHelper.cs" />
<Compile Include="Extensions\Extensions.cs" />
<Compile Include="Models\Archetype.cs" />
<Compile Include="Models\ArchetypeModel.cs" />
<Compile Include="Models\ArchetypePreValue.cs" />
<Compile Include="Models\ArchetypePreValueFieldset.cs" />
<Compile Include="Models\ArchetypePreValueProperty.cs" />
<Compile Include="Models\Fieldset.cs" />
<Compile Include="Models\Property.cs" />
<Compile Include="Models\ArchetypeFieldsetModel.cs" />
<Compile Include="Models\ArchetypePropertyModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\VersionInfo.cs" />
<Compile Include="PropertyConverters\ArchetypeValueConverter.cs" />
<Compile Include="PropertyEditors\ArchetypePropertyEditor.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
@@ -0,0 +1,13 @@
namespace Archetype
{
public static class Constants
{
public const string PropertyEditorAlias = "Imulus.Archetype";
public const string PreValueAlias = "archetypeConfig";
public const string CacheKey_DataTypeByGuid = "";
public const string CacheKey_PreValueFromDataTypeId = "Archetype_GetArchetypePreValueFromDataTypeId_";
}
}
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Web;
namespace Archetype.Events
{
public class ExpireCache : ApplicationEventHandler
{
protected override void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
base.ApplicationStarting(umbracoApplication, applicationContext);
DataTypeService.Saved += ExpirePreValueCache;
}
void ExpirePreValueCache(IDataTypeService sender, global::Umbraco.Core.Events.SaveEventArgs<IDataTypeDefinition> e)
{
foreach (var dataType in e.SavedEntities)
{
ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheItem(Constants.CacheKey_PreValueFromDataTypeId + dataType.Id);
ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheItem(Constants.CacheKey_DataTypeByGuid + dataType.Key);
}
}
}
}
@@ -0,0 +1,151 @@
using System;
using System.Linq;
using Archetype.Models;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Models;
namespace Archetype.Extensions
{
public class ArchetypeHelper
{
protected JsonSerializerSettings _jsonSettings;
protected ApplicationContext _app;
internal ArchetypeHelper()
{
var dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver();
dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic;
_jsonSettings = new JsonSerializerSettings { ContractResolver = dcr };
_app = ApplicationContext.Current;
}
internal Models.ArchetypeModel DeserializeJsonToArchetype(string sourceJson, PreValueCollection dataTypePreValues)
{
try
{
var archetype = JsonConvert.DeserializeObject<Models.ArchetypeModel>(sourceJson, _jsonSettings);
try
{
// Get list of configured properties and their types and map them to the deserialized archetype model
var preValue = GetArchetypePreValueFromPreValuesCollection(dataTypePreValues);
RetrieveAdditionalProperties(ref archetype, preValue);
}
catch (Exception ex)
{
}
return archetype;
}
catch
{
return new Models.ArchetypeModel();
}
}
internal Models.ArchetypeModel DeserializeJsonToArchetype(string sourceJson, int dataTypeId)
{
try
{
var archetype = JsonConvert.DeserializeObject<Models.ArchetypeModel>(sourceJson, _jsonSettings);
try
{
// Get list of configured properties and their types and map them to the deserialized archetype model
var preValue = GetArchetypePreValueFromDataTypeId(dataTypeId);
RetrieveAdditionalProperties(ref archetype, preValue);
}
catch (Exception ex)
{
}
return archetype;
}
catch
{
return new Models.ArchetypeModel();
}
}
private ArchetypePreValue GetArchetypePreValueFromDataTypeId(int dataTypeId)
{
return _app.ApplicationCache.RuntimeCache.GetCacheItem(
Constants.CacheKey_PreValueFromDataTypeId + dataTypeId,
() =>
{
var preValues = _app.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dataTypeId);
var configJson = preValues.IsDictionaryBased
? preValues.PreValuesAsDictionary[Constants.PreValueAlias].Value
: preValues.PreValuesAsArray.First().Value;
var config = JsonConvert.DeserializeObject<ArchetypePreValue>(configJson, _jsonSettings);
RetrieveAdditionalProperties(ref config);
return config;
}) as ArchetypePreValue;
}
private ArchetypePreValue GetArchetypePreValueFromPreValuesCollection(PreValueCollection dataTypePreValues)
{
var preValueAsString = dataTypePreValues.PreValuesAsDictionary.First().Value.Value;
var preValue = JsonConvert.DeserializeObject<ArchetypePreValue>(preValueAsString, _jsonSettings);
return preValue;
}
private IDataTypeDefinition GetDataTypeByGuid(Guid guid)
{
return (IDataTypeDefinition) ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem(
Constants.CacheKey_DataTypeByGuid + guid,
() => _app.Services.DataTypeService.GetDataTypeDefinitionById(guid));
}
/// <summary>
/// Retrieves additional metadata that isn't available on the stored model of an Archetype
/// </summary>
/// <param name="archetype">The Archetype to add the additional metadata to</param>
/// <param name="preValue">The configuration of the Archetype</param>
private void RetrieveAdditionalProperties(ref Models.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 = GetDataTypeByGuid(property.DataTypeGuid).Id;
propertyInst.PropertyEditorAlias = property.PropertyEditorAlias;
}
}
}
}
}
/// <summary>
/// Retrieves additional metadata that isn't available on the stored model of an ArchetypePreValue
/// </summary>
/// <param name="archetype">The Archetype to add the additional metadata to</param>
/// <param name="preValue">The configuration of the Archetype</param>
private void RetrieveAdditionalProperties(ref Models.ArchetypePreValue preValue)
{
foreach (var fieldset in preValue.Fieldsets)
{
foreach (var property in fieldset.Properties)
{
property.PropertyEditorAlias = GetDataTypeByGuid(property.DataTypeGuid).PropertyEditorAlias;
}
}
}
}
}
@@ -1,7 +1,13 @@
using Umbraco.Core;
using Archetype.Umbraco.Models;
using System;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Web;
using Archetype.Models;
namespace Archetype.Umbraco.Extensions
namespace Archetype.Extensions
{
public static class Extensions
{
@@ -13,9 +19,9 @@ namespace Archetype.Umbraco.Extensions
|| input.StartsWith("[") && input.EndsWith("]");
}
public static bool IsArchetype(this Property prop)
public static bool IsArchetype(this ArchetypePropertyModel prop)
{
return prop.PropertyEditorAlias.InvariantEquals("Imulus.Archetype");
return prop.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditorAlias);
}
}
}
@@ -1,14 +0,0 @@
using System.Collections.Generic;
namespace Archetype.Umbraco.Models
{
public class Archetype
{
public IEnumerable<Fieldset> Fieldsets { get; set; }
public Archetype()
{
Fieldsets = new List<Fieldset>();
}
}
}
@@ -0,0 +1,60 @@
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core;
namespace Archetype.Models
{
public class ArchetypeFieldsetModel
{
[JsonProperty("alias")]
public string Alias { get; set; }
[JsonProperty("properties")]
public IEnumerable<ArchetypePropertyModel> Properties;
public ArchetypeFieldsetModel()
{
Properties = new List<ArchetypePropertyModel>();
}
#region Helper Methods
public string GetValue(string propertyAlias)
{
return GetValue<string>(propertyAlias);
}
public T GetValue<T>(string propertyAlias)
{
var property = GetProperty(propertyAlias);
if (property == null || string.IsNullOrEmpty(property.Value.ToString()))
return default(T);
return property.GetValue<T>();
}
public bool HasProperty(string propertyAlias)
{
return GetProperty(propertyAlias) != null;
}
public bool HasValue(string propertyAlias)
{
var property = GetProperty(propertyAlias);
if (property == null)
return false;
return !string.IsNullOrEmpty(property.Value.ToString());
}
private ArchetypePropertyModel GetProperty(string propertyAlias)
{
return Properties.FirstOrDefault(p => p.Alias.InvariantEquals(propertyAlias));
}
#endregion
}
}
@@ -0,0 +1,44 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Archetype.Models
{
[JsonObject]
public class ArchetypeModel : IEnumerable<ArchetypeFieldsetModel>
{
[JsonProperty("fieldsets")]
internal IEnumerable<ArchetypeFieldsetModel> Fieldsets { get; set; }
public ArchetypeModel()
{
Fieldsets = new List<ArchetypeFieldsetModel>();
}
public IEnumerator<ArchetypeFieldsetModel> GetEnumerator()
{
return this.Fieldsets.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
internal string SerializeForPersistence()
{
var json = JObject.Parse(JsonConvert.SerializeObject(this));
var propertiesToRemove = new String[] { "propertyEditorAlias", "dataTypeId", "dataTypeGuid" };
json.Descendants().OfType<JProperty>()
.Where(p => propertiesToRemove.Contains(p.Name))
.ToList()
.ForEach(x => x.Remove());
return json.ToString(Formatting.None);
}
}
}
@@ -1,9 +1,50 @@
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Archetype.Umbraco.Models
namespace Archetype.Models
{
internal class ArchetypePreValue
{
internal IEnumerable<ArchetypePreValueFieldset> Fieldsets { get; set; }
}
public class ArchetypePreValue
{
[JsonProperty("showAdvancedOptions")]
public bool ShowAdvancedOptions { get; set; }
[JsonProperty("startWithAddButton")]
public bool StartWithAddButton { get; set; }
[JsonProperty("hideFieldsetToolbar")]
public bool HideFieldsetToolbar { get; set; }
[JsonProperty("enableMultipleFieldsets")]
public bool EnableMultipleFieldsets { get; set; }
[JsonProperty("enableCollapsing")]
public bool EnableCollapsing { get; set; }
[JsonProperty("hideFieldsetControls")]
public bool HideFieldsetControls { get; set; }
[JsonProperty("hidePropertyLabel")]
public bool HidePropertyLabel { get; set; }
[JsonProperty("maxFieldsets", NullValueHandling = NullValueHandling.Ignore)]
public int MaxFieldsets { get; set; }
[JsonProperty("fieldsets")]
public IEnumerable<ArchetypePreValueFieldset> Fieldsets { get; set; }
[JsonProperty("hidePropertyLabels")]
public bool HidePropertyLabels { get; set; }
[JsonProperty("customCssClass")]
public string CustomCssClass { get; set; }
[JsonProperty("customCssPath")]
public string CustomCssPath { get; set; }
[JsonProperty("customJsPath")]
public string CustomJsPath { get; set; }
[JsonProperty("developerMode")]
public bool DeveloperMode { get; set; }
}
}
@@ -1,10 +1,29 @@
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Archetype.Umbraco.Models
namespace Archetype.Models
{
internal class ArchetypePreValueFieldset
{
internal string Alias { get; set; }
internal IEnumerable<ArchetypePreValueProperty> Properties { get; set; }
}
}
public class ArchetypePreValueFieldset
{
[JsonProperty("alias")]
public string Alias { get; set; }
[JsonProperty("remove")]
public bool Remove { get; set; }
[JsonProperty("collapse")]
public bool Collapse { get; set; }
[JsonProperty("labelTemplate")]
public string LabelTemplate { get; set; }
[JsonProperty("icon")]
public string Icon { get; set; }
[JsonProperty("label")]
public string Label { get; set; }
[JsonProperty("properties")]
public IEnumerable<ArchetypePreValueProperty> Properties { get; set; }
}
}
@@ -1,9 +1,38 @@
namespace Archetype.Umbraco.Models
using System;
using Newtonsoft.Json;
namespace Archetype.Models
{
internal class ArchetypePreValueProperty
{
internal string Alias { get; set; }
internal int DataTypeId { get; set; }
internal string PropertyEditorAlias { get; set; }
}
public class ArchetypePreValueProperty
{
[JsonProperty("alias")]
public string Alias { get; set; }
[JsonProperty("remove")]
public bool Remove { get; set; }
[JsonProperty("collapse")]
public bool Collapse { get; set; }
[JsonProperty("label")]
public string Label { get; set; }
[JsonProperty("helpText")]
public string HelpText { get; set; }
[JsonProperty("dataTypeGuid")]
public Guid DataTypeGuid { get; set; }
[JsonProperty("propertyEditorAlias")]
public string PropertyEditorAlias { get; set; }
[JsonProperty("value")]
public string Value { get; set; }
[JsonProperty("required")]
public bool Required { get; set; }
[JsonProperty("regEx")]
public bool RegEx { get; set; }
}
}
@@ -0,0 +1,90 @@
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web;
namespace Archetype.Models
{
public class ArchetypePropertyModel {
[JsonProperty("alias")]
public string Alias { get; internal set; }
[JsonProperty("value")]
public object Value { get; internal set; }
[JsonProperty("propertyEditorAlias")]
public string PropertyEditorAlias { get; internal set; }
[JsonProperty("dataTypeId")]
public int DataTypeId { get; internal set; }
[JsonProperty("dataTypeGuid")]
internal string DataTypeGuid { get; set; }
public T GetValue<T>()
{
// Try Umbraco's PropertyValueConverters
var converters = UmbracoContext.Current != null ? PropertyValueConvertersResolver.Current.Converters : Enumerable.Empty<IPropertyValueConverter>();
if (converters.Any())
{
var convertedAttempt = TryConvertWithPropertyValueConverters<T>(Value, converters);
if (convertedAttempt.Success)
return convertedAttempt.Result;
}
// If the value is of type T, just return it
if (Value is T)
return (T)Value;
// No PropertyValueConverters matched, so try a regular type conversion
var convertAttempt2 = Value.TryConvertTo<T>();
if (convertAttempt2.Success)
return convertAttempt2.Result;
return default(T);
}
private Attempt<T> TryConvertWithPropertyValueConverters<T>(object value, IEnumerable<IPropertyValueConverter> converters)
{
var properyType = CreateDummyPropertyType(DataTypeId, PropertyEditorAlias);
// In umbraco, there are default value converters that try to convert the
// value if all else fails. The problem is, they are also in the list of
// converters, and the means for filtering these out is internal, so
// we currently have to try ALL converters to see if they can convert
// rather than just finding the most appropreate. If the ability to filter
// out default value converters becomes public, the following logic could
// and probably should be changed.
foreach (var converter in converters.Where(x => x.IsConverter(properyType)))
{
// Convert the type using a found value converter
var value2 = converter.ConvertDataToSource(properyType, value, false);
// If the value is of type T, just return it
if (value2 is T)
return Attempt<T>.Succeed((T)value2);
// Value is not final value type, so try a regular type conversion aswell
var convertAttempt = value2.TryConvertTo<T>();
if (convertAttempt.Success)
return Attempt<T>.Succeed(convertAttempt.Result);
}
return Attempt<T>.Fail();
}
private PublishedPropertyType CreateDummyPropertyType(int dataTypeId, string propertyEditorAlias)
{
return new PublishedPropertyType(null,
new PropertyType(new DataTypeDefinition(-1, propertyEditorAlias)
{
Id = dataTypeId
}));
}
}
}
@@ -1,43 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core;
namespace Archetype.Umbraco.Models
{
public class Fieldset
{
public string Alias { get; set; }
public IEnumerable<Property> Properties;
public Fieldset()
{
Properties = new List<Property>();
}
#region Helper Methods
public string GetValue(string propertyAlias)
{
return GetValue<string>(propertyAlias);
}
public T GetValue<T>(string propertyAlias)
{
var property = GetProperty(propertyAlias);
if (property == null || string.IsNullOrEmpty(property.Value.ToString()))
return default(T);
return property.GetValue<T>();
}
private Property GetProperty(string propertyAlias)
{
return Properties.FirstOrDefault(p => p.Alias.InvariantEquals(propertyAlias));
}
#endregion
}
}
@@ -1,71 +0,0 @@
using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
namespace Archetype.Umbraco.Models
{
public class Property
{
public string Alias { get; internal set; }
public object Value { get; internal set; }
public string PropertyEditorAlias { get; internal set; }
internal int DataTypeId { get; set; }
public T GetValue<T>()
{
// If the value is of type T, just return it
if (Value is T)
return (T)Value;
// Umbraco has the concept of a IPropertyEditorValueConverter which it
// also queries for property resolvers. However I'm not sure what these
// are for, nor can I find any implementations in core, so am currently
// just ignoring these when looking up converters.
// NB: IPropertyEditorValueConverter not to be confused with
// IPropertyValueConverter which are the ones most people are creating
var properyType = CreateDummyPropertyType(DataTypeId, PropertyEditorAlias);
var converters = PropertyValueConvertersResolver.Current.Converters.ToArray();
// In umbraco, there are default value converters that try to convert the
// value if all else fails. The problem is, they are also in the list of
// converters, and the means for filtering these out is internal, so
// we currently have to try ALL converters to see if they can convert
// rather than just finding the most appropreate. If the ability to filter
// out default value converters becomes public, the following logic could
// and probably should be changed.
foreach (var converter in converters.Where(x => x.IsConverter(properyType)))
{
// Convert the type using a found value converter
var value2 = converter.ConvertDataToSource(properyType, Value, false);
// If the value is of type T, just return it
if (value2 is T)
return (T)value2;
// Value is not final value type, so try a regular type conversion aswell
var convertAttempt = value2.TryConvertTo<T>();
if (convertAttempt.Success)
return convertAttempt.Result;
}
// Value is not final value type, so try a regular type conversion
var convertAttempt2 = Value.TryConvertTo<T>();
if (convertAttempt2.Success)
return convertAttempt2.Result;
return default(T);
}
private PublishedPropertyType CreateDummyPropertyType(int dataTypeId, string propertyEditorAlias)
{
return new PublishedPropertyType(null,
new PropertyType(new DataTypeDefinition(-1, propertyEditorAlias)
{
Id = dataTypeId
}));
}
}
}
@@ -2,36 +2,17 @@
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("Archetype")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyDescription("Archetype's supporting code library for Umbraco")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyCompany("Imulus")]
[assembly: AssemblyProduct("Archetype")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyCopyright("Copyright \xa9 Imulus 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)]
[assembly: Guid("E37E94F9-C7BA-4B54-B7E1-64419B3DBA0B")]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e37e94f9-c7ba-4b54-b7e1-64419b3dba0b")]
// 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("0.1.0.0")]
[assembly: AssemblyFileVersion("0.1.0.0")]
[assembly: AssemblyInformationalVersion("0.1.0-alpha")]
[assembly: InternalsVisibleTo("Archetype.Courier")]
[assembly: InternalsVisibleTo("Archetype.Tests")]
@@ -0,0 +1,4 @@
using System.Reflection;
[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0-beta")]
@@ -1,110 +1,48 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Models.PublishedContent;
using Archetype.Umbraco.Models;
using Archetype.Umbraco.Extensions;
using Umbraco.Core.Services;
using Archetype.Extensions;
using Archetype.Models;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
namespace Archetype.Umbraco.PropertyConverters
{
/* based on the Tim Geyssens sample at: https://github.com/TimGeyssens/MatrixPropEditor/blob/master/SamplePropertyValueConverter/SamplePropertyValueConverter/MatrixValueConverter.cs */
[PropertyValueType(typeof(Archetype.Umbraco.Models.Archetype))]
[PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)]
public class ArchetypeValueConverter : PropertyValueConverterBase
{
protected JsonSerializerSettings _jsonSettings;
public ArchetypeValueConverter()
{
var dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver();
dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic;
_jsonSettings = new JsonSerializerSettings { ContractResolver = dcr };
}
public ServiceContext Services
{
get { return ApplicationContext.Current.Services; }
}
public override bool IsConverter(PublishedPropertyType propertyType)
{
return propertyType.PropertyEditorAlias.Equals("Imulus.Archetype");
}
public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview)
{
if (source == null) return null;
var sourceString = source.ToString();
if (sourceString.DetectIsJson())
{
try
{
// Deserialize value to archetype model
var archetype = JsonConvert.DeserializeObject<Models.Archetype>(sourceString, _jsonSettings);
// Get list of configured properties and their types
// and map them to the deserialized archetype model
var preValue = GetArchetypePreValueFromDataTypeId(propertyType.DataTypeId);
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.DataTypeId = property.DataTypeId;
propertyInst.PropertyEditorAlias = property.PropertyEditorAlias;
}
}
}
}
return archetype;
}
catch (Exception ex)
{
return null;
}
}
return sourceString;
}
internal ArchetypePreValue GetArchetypePreValueFromDataTypeId(int dataTypeId)
{
var preValues = Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dataTypeId);
var configJson = preValues.IsDictionaryBased
? preValues.PreValuesAsDictionary["archetypeConfig"].Value
: preValues.PreValuesAsArray.First().Value;
var config = JsonConvert.DeserializeObject<Models.ArchetypePreValue>(configJson, _jsonSettings);
foreach (var fieldset in config.Fieldsets)
{
foreach (var property in fieldset.Properties)
{
// Lookup the properties property editor alias
// (See if we've already looked it up first though to save a database hit)
var propertyWithSameDataType = config.Fieldsets.SelectMany(x => x.Properties)
.FirstOrDefault(x => x.DataTypeId == property.DataTypeId && !string.IsNullOrWhiteSpace(x.PropertyEditorAlias));
property.PropertyEditorAlias = propertyWithSameDataType != null
? propertyWithSameDataType.PropertyEditorAlias
: Services.DataTypeService.GetDataTypeDefinitionById(property.DataTypeId).PropertyEditorAlias;
}
}
return config;
}
}
}
namespace Archetype.PropertyConverters
{
[PropertyValueType(typeof(Models.ArchetypeModel))]
[PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)]
public class ArchetypeValueConverter : PropertyValueConverterBase
{
public ServiceContext Services
{
get { return ApplicationContext.Current.Services; }
}
public override bool IsConverter(PublishedPropertyType propertyType)
{
return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias);
}
public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview)
{
var defaultValue = new Models.ArchetypeModel();
if (source == null)
return defaultValue;
var sourceString = source.ToString();
if (!sourceString.DetectIsJson())
return defaultValue;
var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(source.ToString(),
(propertyType != null ? propertyType.DataTypeId : -1));
return archetype;
}
}
}
@@ -0,0 +1,146 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Archetype.Extensions;
using ClientDependency.Core;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Umbraco.Web.PropertyEditors;
using Umbraco.Core.Logging;
namespace Archetype.PropertyEditors
{
[PropertyEditorAsset(ClientDependencyType.Javascript, "/App_Plugins/Archetype/js/archetype.js")]
[PropertyEditor("Imulus.Archetype", "Archetype", "/App_Plugins/Archetype/views/archetype.html",
ValueType = "JSON")]
public class ArchetypePropertyEditor : PropertyEditor
{
#region Pre Value Editor
protected override PreValueEditor CreatePreValueEditor()
{
return new ArchetypePreValueEditor();
}
internal class ArchetypePreValueEditor : PreValueEditor
{
[PreValueField("archetypeConfig", "Config", "/App_Plugins/Archetype/views/archetype.config.html",
Description = "(Required) Describe your Archetype.")]
public string Config { get; set; }
[PreValueField("hideLabel", "Hide Label", "boolean",
Description = "Hide the Umbraco property title and description, making the Archetype span the entire page width")]
public bool HideLabel { get; set; }
}
#endregion
#region Value Editor
protected override PropertyValueEditor CreateValueEditor()
{
return new ArchetypePropertyValueEditor(base.CreateValueEditor());
}
internal class ArchetypePropertyValueEditor : PropertyValueEditorWrapper
{
protected JsonSerializerSettings _jsonSettings;
public ArchetypePropertyValueEditor(PropertyValueEditor wrapped)
: base(wrapped) { }
public override string ConvertDbToString(Property property, PropertyType propertyType, IDataTypeService dataTypeService)
{
if (property.Value == null || property.Value.ToString() == "")
return string.Empty;
var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId);
foreach (var fieldset in archetype.Fieldsets)
{
foreach (var propDef in fieldset.Properties)
{
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);
}
}
}
return archetype.SerializeForPersistence();
}
public override object ConvertDbToEditor(Property property, PropertyType propertyType, IDataTypeService dataTypeService)
{
if (property.Value == null || property.Value.ToString() == "")
return string.Empty;
var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId);
foreach (var fieldset in archetype.Fieldsets)
{
foreach (var propDef in fieldset.Properties)
{
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);
}
}
}
return archetype;
}
public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue)
{
if (editorValue.Value == null || editorValue.Value.ToString() == "")
return string.Empty;
var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(editorValue.Value.ToString(), editorValue.PreValues);
foreach (var fieldset in archetype.Fieldsets)
{
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);
}
}
}
return archetype.SerializeForPersistence();
}
}
#endregion
}
}
+11
View File
@@ -0,0 +1,11 @@
<?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>
</assemblyBinding>
</runtime>
</configuration>
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AutoMapper" version="3.0.0" targetFramework="net45" />
<package id="ClientDependency" version="1.7.0.4" 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.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.1" targetFramework="net45" />
@@ -17,8 +19,8 @@
<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="4.5.11" 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.0.1" targetFramework="net45" />
<package id="UmbracoCms.Core" version="7.1.2" targetFramework="net45" />
<package id="xmlrpcnet" version="2.5.0" targetFramework="net45" />
</packages>
-148
View File
@@ -1,148 +0,0 @@
[
{
"propertyEditorAlias": "Umbraco.CheckBoxList",
"view": "checkboxlist"
},
{
"propertyEditorAlias": "Umbraco.ColorPickerAlias",
"view": "colorpicker"
},
{
"propertyEditorAlias": "Umbraco.ContentPickerAlias",
"view": "contentpicker"
},
{
"propertyEditorAlias": "Umbraco.Date",
"view": "datepicker",
"defaultPreValues": [{ "format": "yyyy-MM-dd", "pickTime": false }]
},
{
"propertyEditorAlias": "Umbraco.DateTime",
"view": "datepicker",
"format": "yyyy-MM-dd hh:mm:ss"
},
{
"propertyEditorAlias": "Umbraco.DropDown",
"view": "dropdown"
},
{
"propertyEditorAlias": "Umbraco.DropDownMultiple",
"view": "dropdown"
},
{
"propertyEditorAlias": "Umbraco.DropDownMultiplePublishKeys",
"view": "dropdown"
},
{
"propertyEditorAlias": "Umbraco.DropdownlistPublishingKeys",
"view": "dropdown"
},
{
"propertyEditorAlias": "Umbraco.EmailAddress",
"view": "email"
},
{
"propertyEditorAlias": "Umbraco.UploadField",
"view": "fileupload"
},
{
"propertyEditorAlias": "Umbraco.FolderBrowser",
"view": "folderbrowser"
},
{
"propertyEditorAlias": "Umbraco.Integer",
"view": "integer"
},
{
"propertyEditorAlias": "Umbraco.NoEdit",
"view": "readonlyvalue"
},
{
"propertyEditorAlias": "Umbraco.ListView",
"view": "listview"
},
{
"propertyEditorAlias": "Umbraco.MacroContainer",
"view": "macrocontainer"
},
{
"propertyEditorAlias": "Umbraco.MarkdownEditor",
"view": "markdowneditor"
},
{
"propertyEditorAlias": "Umbraco.MediaPicker",
"view": "mediapicker",
"defaultPreValues": [{ "multiPicker": "0" }]
},
{
"propertyEditorAlias": "Umbraco.MemberGroupPicker",
"view": "membergrouppicker"
},
{
"propertyEditorAlias": "Umbraco.MemberPicker",
"view": "memberpicker"
},
{
"propertyEditorAlias": "Umbraco.MultiNodeTreePicker",
"view": "contentpicker",
"defaultPreValues": [{ "multiPicker": "1" }]
},
{
"propertyEditorAlias": "Umbraco.MultipleMediaPicker",
"view": "mediapicker"
},
{
"propertyEditorAlias": "Umbraco.MultipleTextstring",
"view": "multipletextbox"
},
{
"propertyEditorAlias": "Umbraco.RadioButtonList",
"view": "radiobuttons"
},
{
"propertyEditorAlias": "Umbraco.RelatedLinks",
"view": "relatedlinks"
},
{
"propertyEditorAlias": "Umbraco.TinyMCEv3",
"view": "rte"
},
{
"propertyEditorAlias": "Umbraco.Slider",
"view": "slider"
},
{
"propertyEditorAlias": "Umbraco.Tags",
"view": "tags",
"defaultPreValues": [{ "group": "default" }]
},
{
"propertyEditorAlias": "Umbraco.TextboxMultiple",
"view": "textarea"
},
{
"propertyEditorAlias": "Umbraco.Textbox",
"view": "textbox"
},
{
"propertyEditorAlias": "Umbraco.TrueFalse",
"view": "boolean"
},
{
"propertyEditorAlias": "Umbraco.UserPicker",
"view": "entitypicker",
"defaultPreValues": [{ "entityType": "User" }]
},
{
"propertyEditorAlias": "Umbraco.NoEdit",
"view": "readonlyvalue"
},
{
"propertyEditorAlias": "Umbraco.Textbox",
"view": "textbox"
},
{
"propertyEditorAlias": "Imulus.Archetype",
"view": "/App_Plugins/Archetype/views/archetype.html"
}
]
+60 -38
View File
@@ -1,19 +1,19 @@
angular.module("umbraco").controller("Imulus.ArchetypeConfigController", function ($scope, $http, assetsService, dialogService, archetypePropertyEditorResource) {
//$scope.model.value = "";
//console.log($scope.model.value);
//$scope.model.value = "";
//console.log($scope.model.value);
//define empty items
var newPropertyModel = '{"alias": "", "remove": false, "collapse": false, "label": "", "helpText": "", "dataTypeId": "-88", "value": ""}';
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, "hideFieldsetToolbar": false, "enableMultipleFieldsets": false, "hideFieldsetControls": false, "hidePropertyLabel": false, "maxFieldsets": null, "fieldsets": [' + newFieldsetModel + ']}');
var defaultFieldsetConfigModel = JSON.parse('{"showAdvancedOptions": false, "startWithAddButton": false, "hideFieldsetToolbar": false, "enableMultipleFieldsets": false, "hideFieldsetControls": false, "hidePropertyLabel": false, "maxFieldsets": null, "enableCollapsing": true, "fieldsets": [' + newFieldsetModel + ']}');
//ini the model
$scope.model.value = $scope.model.value || defaultFieldsetConfigModel;
//ini the render model
initConfigRenderModel();
//get the available datatypes
archetypePropertyEditorResource.getAllDataTypes().then(function(data) {
$scope.availableDataTypes = data;
@@ -40,16 +40,16 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
}
};
//function that determines how to manage expanding/collapsing fieldsets
$scope.focusFieldset = function(fieldset){
var iniState;
if(fieldset)
{
iniState = fieldset.collapse;
}
_.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset){
if($scope.archetypeConfigRenderModel.fieldsets.length == 1 && fieldset.remove == false)
{
@@ -66,7 +66,7 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
fieldset.collapse = false;
}
});
if(iniState)
{
fieldset.collapse = !iniState;
@@ -79,7 +79,7 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
//function that determines how to manage expanding/collapsing properties
$scope.focusProperty = function(properties, property){
var iniState;
if(property)
{
iniState = property.collapse;
@@ -95,7 +95,7 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
property.collapse = false;
}
});
if(iniState)
{
property.collapse = !iniState;
@@ -106,27 +106,45 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
_.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset){
$scope.focusProperty(fieldset.properties);
});
//setup JSON.stringify helpers
$scope.archetypeConfigRenderModel.toString = stringify;
//encapsulate stringify (should be built into browsers, not sure of IE support)
function stringify() {
return JSON.stringify(this);
}
//watch for changes
$scope.$watch('archetypeConfigRenderModel', function (v) {
//console.log(v);
if (typeof v === 'string') {
if (typeof v === 'string') {
$scope.archetypeConfigRenderModel = JSON.parse(v);
$scope.archetypeConfigRenderModel.toString = stringify;
}
});
$scope.autoPopulateAlias = function(s) {
var modelType = s.hasOwnProperty('fieldset') ? 'fieldset' : 'property';
var modelProperty = s[modelType];
if (!modelProperty.aliasIsDirty) {
modelProperty.alias = modelProperty.label.toUmbracoAlias();
}
}
$scope.markAliasDirty = function(s) {
var modelType = s.hasOwnProperty('fieldset') ? 'fieldset' : 'property';
var modelProperty = s[modelType];
if (!modelProperty.aliasIsDirty) {
modelProperty.aliasIsDirty = true;;
}
}
//helper that returns if an item can be removed
$scope.canRemoveFieldset = function ()
{
{
return countVisibleFieldset() > 1;
}
@@ -135,10 +153,10 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
{
return countVisibleFieldset() > 1;
}
//helper that returns if an item can be removed
$scope.canRemoveProperty = function (fieldset)
{
{
return countVisibleProperty(fieldset) > 1;
}
@@ -148,17 +166,17 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
return countVisibleProperty(fieldset) > 1;
}
$scope.getDataTypeNameById = function (id) {
$scope.getDataTypeNameByGuid = function (guid) {
if ($scope.availableDataTypes == null) // Might not be initialized yet?
return "";
var dataType = _.find($scope.availableDataTypes, function(d) {
return d.id == id;
return d.guid == guid;
});
return dataType == null ? "" : dataType.name;
}
//helper to count what is visible
function countVisibleFieldset()
{
@@ -172,7 +190,7 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
return count;
}
//determines how many properties are visible
function countVisibleProperty(fieldset)
{
@@ -186,13 +204,13 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
return count;
}
//handles a fieldset add
$scope.addFieldsetRow = function ($index, $event) {
$scope.archetypeConfigRenderModel.fieldsets.splice($index + 1, 0, JSON.parse(newFieldsetModel));
$scope.focusFieldset();
}
//rather than splice the archetypeConfigRenderModel, we're hiding this and cleaning onFormSubmitting
$scope.removeFieldsetRow = function ($index) {
if ($scope.canRemoveFieldset()) {
@@ -201,12 +219,12 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
}
}
}
//handles a property add
$scope.addPropertyRow = function (fieldset, $index) {
fieldset.properties.splice($index + 1, 0, JSON.parse(newPropertyModel));
}
//rather than splice the archetypeConfigRenderModel, we're hiding this and cleaning onFormSubmitting
$scope.removePropertyRow = function (fieldset, $index) {
if ($scope.canRemoveProperty(fieldset)) {
@@ -215,7 +233,7 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
}
}
}
//helper to ini the render model
function initConfigRenderModel()
{
@@ -224,6 +242,8 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
_.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset){
fieldset.remove = false;
if (fieldset.alias.length > 0)
fieldset.aliasIsDirty = true;
if(fieldset.label)
{
@@ -232,41 +252,43 @@ angular.module("umbraco").controller("Imulus.ArchetypeConfigController", functio
_.each(fieldset.properties, function(fieldset){
fieldset.remove = false;
if (fieldset.alias.length > 0)
fieldset.aliasIsDirty = true;
});
});
}
//sync things up on save
$scope.$on("formSubmitting", function (ev, args) {
syncModelToRenderModel();
});
//helper to sync the model to the renderModel
function syncModelToRenderModel()
{
$scope.model.value = $scope.archetypeConfigRenderModel;
var fieldsets = [];
_.each($scope.archetypeConfigRenderModel.fieldsets, function(fieldset){
//check fieldsets
if (!fieldset.remove) {
fieldsets.push(fieldset);
var properties = [];
_.each(fieldset.properties, function(property){
if (!property.remove) {
properties.push(property);
}
}
});
fieldset.properties = properties;
}
});
$scope.model.value.fieldsets = fieldsets;
}
//archetype css
assetsService.loadCss("/App_Plugins/Archetype/css/archetype.css");
});
+111 -119
View File
@@ -1,23 +1,23 @@
angular.module("umbraco").controller("Imulus.ArchetypeController", function ($scope, $http, assetsService, angularHelper, notificationsService) {
angular.module("umbraco").controller("Imulus.ArchetypeController", function ($scope, $http, assetsService, angularHelper, notificationsService, $timeout) {
//$scope.model.value = "";
$scope.model.hideLabel = $scope.model.config.hideLabel == 1;
//get a reference to the current form
var form = angularHelper.getCurrentForm($scope);
$scope.form = $scope.form || angularHelper.getCurrentForm($scope);
//set the config equal to our prevalue config
$scope.model.config = $scope.model.config.archetypeConfig;
//ini the model
$scope.model.value = $scope.model.value || { fieldsets: [getEmptyRenderFieldset($scope.model.config.fieldsets[0])] };
//ini the render model
$scope.archetypeRenderModel = {};
initArchetypeRenderModel();
//ini the model
$scope.model.value = $scope.model.value || getDefaultModel($scope.model.config);
init();
//helper to get $eval the labelTemplate
$scope.getFieldsetTitle = function(fieldsetConfigModel, fieldsetIndex) {
var fieldset = $scope.archetypeRenderModel.fieldsets[fieldsetIndex];
if(!fieldsetConfigModel)
return "";
var fieldset = $scope.model.value.fieldsets[fieldsetIndex];
var fieldsetConfig = $scope.getConfigFieldsetByAlias(fieldset.alias);
var template = fieldsetConfigModel.labelTemplate;
@@ -43,7 +43,7 @@
cursor: "move",
handle: ".handle",
update: function (ev, ui) {
$scope.setDirty();
},
stop: function (ev, ui) {
@@ -60,23 +60,25 @@
if (typeof $index != 'undefined')
{
$scope.archetypeRenderModel.fieldsets.splice($index + 1, 0, newFieldset);
$scope.model.value.fieldsets.splice($index + 1, 0, newFieldset);
}
else
{
$scope.archetypeRenderModel.fieldsets.push(newFieldset);
$scope.model.value.fieldsets.push(newFieldset);
}
}
newFieldset.collapse = true;
$scope.setDirty();
newFieldset.collapse = $scope.model.config.enableCollapsing ? true : false;
$scope.focusFieldset(newFieldset);
}
}
//rather than splice the archetypeRenderModel, we're hiding this and cleaning onFormSubmitting
$scope.removeRow = function ($index) {
if ($scope.canRemove()) {
if (confirm('Are you sure you want to remove this?')) {
$scope.archetypeRenderModel.fieldsets[$index].remove = true;
$scope.setDirty();
$scope.model.value.fieldsets.splice($index, 1);
}
}
}
@@ -94,8 +96,10 @@
//helper that returns if an item can be removed
$scope.canRemove = function ()
{
return countVisible() > 1;
{
return countVisible() > 1
|| ($scope.model.config.maxFieldsets == 1 && $scope.model.config.fieldsets.length > 1)
|| $scope.model.config.startWithAddButton;
}
//helper that returns if an item can be sorted
@@ -104,16 +108,26 @@
return countVisible() > 1;
}
//helper, ini the render model from the server (model.value)
function initArchetypeRenderModel() {
$scope.archetypeRenderModel = $scope.model.value;
//helpers for determining if the add button should be shown
$scope.showAddButton = function () {
return $scope.model.config.startWithAddButton
&& countVisible() === 0;
///&& $scope.model.config.fieldsets.length == 1;
}
_.each($scope.archetypeRenderModel.fieldsets, function (fieldset)
//helper, ini the render model from the server (model.value)
function init() {
$scope.model.value = removeNulls($scope.model.value);
addDefaultProperties($scope.model.value.fieldsets);
}
function addDefaultProperties(fieldsets)
{
_.each(fieldsets, function (fieldset)
{
fieldset.remove = false;
fieldset.collapse = false;
fieldset.isValid = true;
});
});
}
//helper to get the correct fieldset from config
@@ -130,38 +144,52 @@
});
return (typeof property !== 'undefined') ? property.value : '';
};
$scope.isCollapsed = function(fieldset)
{
if(typeof fieldset.collapse === "undefined")
{
fieldset.collapse = true;
}
return fieldset.collapse;
}
//helper for expanding/collapsing fieldsets
$scope.focusFieldset = function(fieldset){
fixDisableSelection();
if (!$scope.model.config.enableCollapsing) {
return;
}
var iniState;
if(fieldset)
{
iniState = fieldset.collapse;
}
_.each($scope.archetypeRenderModel.fieldsets, function(fieldset){
if($scope.archetypeRenderModel.fieldsets.length == 1 && fieldset.remove == false)
{
fieldset.collapse = false;
return;
}
_.each($scope.model.value.fieldsets, function(fieldset){
fieldset.collapse = true;
});
if(iniState)
if(!fieldset && $scope.model.value.fieldsets.length == 1)
{
$scope.model.value.fieldsets[0].collapse = false;
return;
}
if(iniState && fieldset)
{
fieldset.collapse = !iniState;
}
}
//ini the fieldset expand/collapse
$scope.focusFieldset();
//developerMode helpers
$scope.archetypeRenderModel.toString = stringify;
$scope.model.value.toString = stringify;
//encapsulate stringify (should be built into browsers, not sure of IE support)
function stringify() {
@@ -169,12 +197,12 @@
}
//watch for changes
$scope.$watch('archetypeRenderModel', function (v) {
$scope.$watch('model.value', function (v) {
if ($scope.model.config.developerMode) {
console.log(v);
if (typeof v === 'string') {
$scope.archetypeRenderModel = JSON.parse(v);
$scope.archetypeRenderModel.toString = stringify;
$scope.model.value = JSON.parse(v);
$scope.model.value.toString = stringify;
}
}
});
@@ -182,78 +210,52 @@
//helper to count what is visible
function countVisible()
{
var count = 0;
_.each($scope.archetypeRenderModel.fieldsets, function(fieldset){
if (fieldset.remove == false) {
count++;
}
});
return count;
return $scope.model.value.fieldsets.length;
}
//helper to sync the model to the renderModel
function syncModelToRenderModel()
{
$scope.model.value = { fieldsets: [] };
// helper to get initial model if none was provided
function getDefaultModel(config) {
if (config.startWithAddButton)
return { fieldsets: [] };
_.each($scope.archetypeRenderModel.fieldsets, function(fieldset){
var cleanedFieldset = cleanFieldset(fieldset);
if(cleanFieldset){
$scope.model.value.fieldsets.push(cleanedFieldset);
}
});
}
//helper to remove properties only used during editing that we don't want in the saved data
//also removes properties that are no longer in the config
function cleanFieldset(fieldset)
{
if (typeof fieldset != 'function' && !fieldset.remove){
var fieldsetConfig = $scope.getConfigFieldsetByAlias(fieldset.alias);
//clone and clean
var tempFieldset = JSON.parse(JSON.stringify(fieldset));
delete tempFieldset.remove;
delete tempFieldset.isValid;
delete tempFieldset.collapse;
_.each(tempFieldset.properties, function(property, index){
var propertyConfig = _.find(fieldsetConfig.properties, function(p){
return property.alias == p.alias;
});
//just prune the property
if(propertyConfig){
delete property.isValid;
}
else
{
//need to remove the whole property
tempFieldset.properties.splice(index, 1);
}
});
return tempFieldset;
}
return { fieldsets: [getEmptyRenderFieldset(config.fieldsets[0])] };
}
//helper to add an empty fieldset to the render model
function getEmptyRenderFieldset (fieldsetModel)
{
return JSON.parse('{"alias": "' + fieldsetModel.alias + '", "remove": false, "isValid": true, "properties": []}');
function getEmptyRenderFieldset (fieldsetModel) {
return {alias: fieldsetModel.alias, collapse: false, isValid: true, properties: []};
}
//helper to ensure no nulls make it into the model
function removeNulls(model){
if(model.fieldsets){
_.each(model.fieldsets, function(fieldset, index){
if(!fieldset){
model.fieldsets.splice(index, 1);
removeNulls(model);
}
});
return model;
}
}
// Hack for U4-4281 / #61
function fixDisableSelection() {
$timeout(function() {
$('.archetypeEditor .controls')
.bind('mousedown.ui-disableSelection selectstart.ui-disableSelection', function(e) {
e.stopImmediatePropagation();
});
}, 1000);
}
//helper to lookup validity when given a fieldsetIndex and property alias
$scope.getPropertyValidity = function(fieldsetIndex, alias)
{
if($scope.archetypeRenderModel.fieldsets[fieldsetIndex])
if($scope.model.value.fieldsets[fieldsetIndex])
{
var property = _.find($scope.archetypeRenderModel.fieldsets[fieldsetIndex].properties, function(property){
var property = _.find($scope.model.value.fieldsets[fieldsetIndex].properties, function(property){
return property.alias == alias;
});
}
@@ -261,27 +263,17 @@
return (typeof property == 'undefined') ? true : property.isValid;
}
//sync things up on save
$scope.$on("formSubmitting", function (ev, args) {
//test for form; may have to do this differently for nested archetypes
if(!form)
return;
if(form.$invalid)
{
notificationsService.warning("Cannot Save Document", "The document could not be saved because of missing required fields.")
// helper to force the current form into the dirty state
$scope.setDirty = function () {
if($scope.form) {
$scope.form.$setDirty();
}
else
{
syncModelToRenderModel();
}
});
}
//custom js
if ($scope.model.config.customJsPath) {
assetsService.loadJs($scope.model.config.customJsPath);
}
}
//archetype css
assetsService.loadCss("/App_Plugins/Archetype/css/archetype.css");
+41 -18
View File
@@ -1,4 +1,4 @@
angular.module("umbraco.directives").directive('archetypeProperty', function ($compile, $http, archetypePropertyEditorResource, umbPropEditorHelper) {
angular.module("umbraco.directives").directive('archetypeProperty', function ($compile, $http, archetypePropertyEditorResource, umbPropEditorHelper, $timeout, $rootScope, $q) {
function getFieldsetByAlias(fieldsets, alias)
{
@@ -51,16 +51,17 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
var configFieldsetModel = getFieldsetByAlias(scope.archetypeConfig.fieldsets, scope.fieldset.alias);
var view = "";
var label = configFieldsetModel.properties[scope.propertyConfigIndex].label;
var dataTypeId = configFieldsetModel.properties[scope.propertyConfigIndex].dataTypeId;
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 umbracoPropertyAlias = scope.umbracoPropertyAlias;
//try to convert the defaultValue to a JS object
defaultValue = jsonOrString(defaultValue, scope.archetypeConfig.developerMode, "defaultValue");
//grab info for the selected datatype, prepare for view
archetypePropertyEditorResource.getDataType(dataTypeId).then(function (data) {
archetypePropertyEditorResource.getDataType(dataTypeGuid).then(function (data) {
//transform preValues array into object expected by propertyeditor views
var configObj = {};
_.each(data.preValues, function(p) {
@@ -74,14 +75,13 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
//load in the DefaultPreValues for the PropertyEditor, if any
var defaultConfigObj = {};
if (propertyEditor.hasOwnProperty('defaultPreValues')) {
_.each(propertyEditor.defaultPreValues, function(p) {
_.extend(defaultConfigObj, p)
});
if (propertyEditor.hasOwnProperty('defaultPreValues') && propertyEditor.defaultPreValues != null) {
_.extend(defaultConfigObj, propertyEditor.defaultPreValues);
}
var mergedConfig = _.extend(defaultConfigObj, config);
loadView(pathToView, mergedConfig, defaultValue, alias, scope, element, ngModelCtrl);
loadView(pathToView, mergedConfig, defaultValue, alias, umbracoPropertyAlias, scope, element, ngModelCtrl);
});
});
@@ -97,11 +97,22 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
property.isValid = true;
var propertyConfig = getPropertyByAlias(configFieldsetModel, property.alias);
if(propertyConfig && propertyConfig.required && property.value == ""){
fieldset.isValid = false;
property.isValid = false;
valid = false;
if (propertyConfig) {
if(propertyConfig.required && (property.value == null || property.value === "")) {
fieldset.isValid = false;
property.isValid = false;
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) {
fieldset.isValid = false;
property.isValid = false;
valid = false;
}
}
}
});
});
@@ -111,7 +122,7 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
}
}
function loadView(view, config, defaultValue, alias, scope, element, ngModelCtrl) {
function loadView(view, config, defaultValue, alias, umbracoPropertyAlias, scope, element, ngModelCtrl) {
if (view)
{
$http.get(view).success(function (data) {
@@ -122,6 +133,7 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
}
//define the initial model and config
scope.form = scope.umbracoForm;
scope.model = {};
scope.model.config = {};
@@ -139,18 +151,27 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
scope.model.config = config;
//some items need an alias
scope.model.alias = "archetype-property-" + scope.fieldsetIndex + "-" + scope.propertyConfigIndex;
scope.model.alias = "archetype-property-" + umbracoPropertyAlias + "-" + scope.fieldsetIndex + "-" + scope.propertyConfigIndex;
//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;
//trigger the validation pipeline
ngModelCtrl.$setViewValue(ngModelCtrl.$viewValue);
// don't set the current value twice - this will keep Umbraco from prompting to discard changes immediately after saving
if (newValue != oldValue) {
//trigger the validation pipeline
ngModelCtrl.$setViewValue(ngModelCtrl.$viewValue);
}
});
element.html(data).show();
$compile(element.contents())(scope);
$timeout(function() {
var def = $q.defer();
def.resolve(true);
$rootScope.$apply();
}, 500)
}
});
}
@@ -167,7 +188,9 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c
archetypeConfig: '=',
fieldset: '=',
fieldsetIndex: '=',
archetypeRenderModel: '='
archetypeRenderModel: '=',
umbracoPropertyAlias: '=',
umbracoForm: '='
}
}
});
-15
View File
@@ -1,15 +0,0 @@
angular.module('umbraco.filters').filter("archetypeLocale", function(){
return function(key, locales){
if(!locales)
return key;
if(!locales.defaultLocale)
return key;
if(!locales.locale)
return key;
return locales.locale[key] || locales.defaultLocale[key] || key;
}
})
+31 -30
View File
@@ -1,34 +1,35 @@
{
"label": "Label",
"alias": "Alias",
"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",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
"icon": "Icon"
"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"
}
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+1
View File
@@ -27,6 +27,7 @@
"defaultValue": "Default Value",
"dataType": "DataType",
"required": "Required",
"regEx": "RegEx Validation",
"properties": "Properties",
"labelTemplate": "Label Template",
"select": "Select",
+69 -14
View File
@@ -1,5 +1,9 @@
.archetypeEditor {
width: 98%;
.dropdown-menu {
top: auto;
}
}
.archetypeEditor fieldset{
@@ -13,25 +17,51 @@
}
.archetypeEditor .archetypeFieldsetLabel {
padding: 8px 25px 8px 3px;
float: left;
width: 98%;
position: relative;
width: 100%%;
.label-sub {
padding: 8px 0;
display: inline-block;
&.module-label {
width: 100%;
}
}
.dropdown-menu {
padding: 0;
border-radius: 0;
box-shadow: none;
margin-top: -10px;
margin-left: -200px;
}
span {
font-weight: bold;
&.menu-label { font-weight: normal; }
}
&:hover {
label:hover {
cursor: default;
}
&.enableCollapsing:hover {
cursor: pointer;
label span {
text-decoration: underline;
label {
span {
text-decoration: underline;
}
&:hover {
cursor: pointer;
}
}
}
.caret {
float:left;
margin: 8px 1px 0 7px;
margin: 8px 1px 0 15px;
&.caret-right {
border-bottom: 4px solid transparent;
border-top: 4px solid transparent;
@@ -42,8 +72,6 @@
}
label{
float: left;
width: 80%;
margin-bottom: 0;
margin-left: 5px;
padding: 0;
@@ -56,7 +84,6 @@
.archetypeEditor .archetypeCollapser{
clear: both;
height: 100%;
margin-top: 10px;
padding-top: 12px;
background-color: #fff;
border-top: 1px solid silver;
@@ -72,9 +99,11 @@
margin-left: 0;
}
.archetypeEditor, .archetypeConfig{
.archetypeEditorControls{
.archetypeEditor,
.archetypeConfig {
.archetypeEditorControls {
float: right;
i {
cursor: pointer;
&.handle {
@@ -84,6 +113,17 @@
}
}
.archetypeEditor .archetypeEditorControls {
float: none;
position: absolute;
right: 15px;
top: 0;
}
.archetypeConfig .archetypeEditorControls {
float: right;
}
.archetypeEditor form {
margin-left:20px;
@@ -250,6 +290,13 @@
border: 1px solid #b94a48;
}
.archetypeEditor .archetypeProperty {
label {
span {
color: #343434;
}
}
}
.archetypeEditor .archetypePropertyError{
margin-bottom: 5px;
padding-top: 3px;
@@ -264,6 +311,14 @@
}
}
.archetypeEditor .archetypeAddButton:hover {
text-decoration: none;
.archetypeAddButtonText {
text-decoration: underline;
}
}
.ui-sortable-placeholder {
visibility: visible !important;
background-color: #d0e7f1 !important;
@@ -281,4 +336,4 @@
span {
color: #343434;
}
}
}
-30
View File
@@ -1,30 +0,0 @@
{
propertyEditors: [
{
alias: "Imulus.Archetype",
name: "Archetype",
editor: {
view: "~/App_Plugins/Archetype/views/archetype.html",
valueType: "JSON"
},
prevalues: {
fields: [
{
label: "Config",
description: "(Required) Describe your Archetype.",
key: "archetypeConfig",
view: "/App_Plugins/Archetype/views/archetype.config.html",
validation: [
{
type: "Required"
}
]
}
]
}
}
],
javascript: [
'~/App_Plugins/Archetype/js/archetype.js'
]
}
+6 -10
View File
@@ -3,24 +3,20 @@ angular.module('umbraco.resources').factory('archetypePropertyEditorResource', f
getAllDataTypes: function() {
// Hack - grab DataTypes from Tree API, as `dataTypeService.getAll()` isn't implemented yet
return umbRequestHelper.resourcePromise(
$http.get("/umbraco/backoffice/UmbracoTrees/DataTypeTree/GetNodes?id=-1&application=developer&tree=&isDialog=false"), 'Failed to retrieve datatypes from tree service'
).then(function (data) {
return data.map(function(d) {
return { "id": d.id, "name": d.name }
});
});
$http.get("/umbraco/backoffice/ArchetypeApi/ArchetypeDataType/GetAll"), 'Failed to retrieve datatypes from tree service'
);
},
getDataType: function(id) {
getDataType: function(guid) {
return umbRequestHelper.resourcePromise(
$http.get("/umbraco/backoffice/UmbracoApi/DataType/GetById?id=" + id), 'Failed to retrieve datatype'
$http.get("/umbraco/backoffice/ArchetypeApi/ArchetypeDataType/GetByGuid?guid=" + guid), 'Failed to retrieve datatype'
);
},
getPropertyEditorMapping: function(alias) {
return umbRequestHelper.resourcePromise(
$http.get("/App_plugins/Archetype/js/propertyEditors.views.js"), 'Failed to retrieve datatype mappings'
$http.get("/umbraco/backoffice/ArchetypeApi/ArchetypeDataType/GetAllPropertyEditors"), 'Failed to retrieve datatype mappings'
).then(function (data) {
var result = _.find(data, function(d) {
return d.propertyEditorAlias === alias;
return d.alias === alias;
});
if (result != null)
+20 -8
View File
@@ -11,11 +11,11 @@
<div class="archetypeFieldsetCollapser" ng-hide="fieldset.collapse && fieldset.label">
<div class="archetypeFieldsetOption">
<label for="archetypeFieldLabel_{{$index}}"><archetype-localize key="label">Label</archetype-localize></label>
<input type="text" id="archetypeFieldLabel_{{$index}}" ng-model="fieldset.label" />
<input type="text" id="archetypeFieldLabel_{{$index}}" ng-model="fieldset.label" on-keyup="autoPopulateAlias(this)" />
</div>
<div class="archetypeFieldsetOption">
<label for="archetypeFieldAlias_{{$index}}"><archetype-localize key="alias">Alias</archetype-localize></label>
<input type="text" id="archetypeFieldAlias_{{$index}}" ng-model="fieldset.alias" required/>
<input type="text" id="archetypeFieldAlias_{{$index}}" ng-model="fieldset.alias" on-keyup="markAliasDirty(this)" required/>
</div>
<div class="archetypeFieldsetOption">
<label for="archetypeFieldLabelTemplate_{{$index}}"><archetype-localize key="labelTemplate">Label Template</archetype-localize></label>
@@ -27,7 +27,7 @@
</div>
<div class="archetypeFieldsetOption">
<label><archetype-localize key="properties">Properties</archetype-localize></label>
</div>
</div>
<div class="archetypePropertiesWrapper">
<ul ui-sortable="sortableOptions" ng-model="fieldset.properties">
<li ng-repeat="property in fieldset.properties" ng-hide="property.remove">
@@ -37,16 +37,16 @@
<i class="icon icon-navigation handle" ng-show="canSortProperty(fieldset)"></i>
</div>
<div class="archetypePropertyTitle" ng-click="focusProperty(fieldset.properties, property)">
{{property.label}} ({{property.alias}}) - <span>{{getDataTypeNameById(property.dataTypeId)}}</span>
{{property.label}} ({{property.alias}}) - <span>{{getDataTypeNameByGuid(property.dataTypeGuid)}}</span>
</div>
<div class="archetypePropertyCollapser" ng-hide="property.collapse && property.label">
<div>
<label for="archetypePropertyLabel_{{$parent.$index}}_{{$index}}"><archetype-localize key="label">Label</archetype-localize></label>
<input type="text" id="archetypePropertyLabel_{{$parent.$index}}_{{$index}}" ng-model="property.label" />
<input type="text" id="archetypePropertyLabel_{{$parent.$index}}_{{$index}}" ng-model="property.label" on-keyup="autoPopulateAlias(this)"/>
</div>
<div>
<label for="archetypePropertyAlias_{{$parent.$index}}_{{$index}}"><archetype-localize key="alias">Alias</archetype-localize></label>
<input type="text" id="archetypePropertyAlias_{{$parent.$index}}_{{$index}}" ng-model="property.alias" required/>
<input type="text" id="archetypePropertyAlias_{{$parent.$index}}_{{$index}}" ng-model="property.alias" on-keyup="markAliasDirty(this)" required/>
</div>
<div>
<label for="archetypePropertyHelpText_{{$parent.$index}}_{{$index}}"><archetype-localize key="helpText">Help Text</archetype-localize></label>
@@ -54,7 +54,7 @@
</div>
<div>
<label for="archetypePropertyDataType_{{$parent.$index}}_{{$index}}"><archetype-localize key="dataType">Datatype</archetype-localize></label>
<select id="archetypePropertyDataType_{{$parent.$index}}_{{$index}}" ng-model="property.dataTypeId" ng-options="datatype.id as datatype.name for datatype in availableDataTypes"></select>
<select id="archetypePropertyDataType_{{$parent.$index}}_{{$index}}" ng-model="property.dataTypeGuid" ng-options="datatype.guid as datatype.name for datatype in availableDataTypes | orderBy:'name'"></select>
</div>
<div>
<label for="archetypePropertyDefaultValue_{{$parent.$index}}_{{$index}}"><archetype-localize key="defaultValue">Default Value</archetype-localize></label>
@@ -64,6 +64,10 @@
<label for="archetypePropertyRequired_{{$parent.$index}}_{{$index}}"><archetype-localize key="required">Required</archetype-localize></label>
<input type="checkbox" id="archetypePropertyRequired_{{$parent.$index}}_{{$index}}" ng-model="property.required" />
</div>
<div>
<label for="archetypePropertyRegEx_{{$parent.$index}}_{{$index}}"><archetype-localize key="regEx">RegEx Validation</archetype-localize></label>
<input type="text" id="archetypePropertyRegExValue_{{$parent.$index}}_{{$index}}" ng-model="property.regEx" />
</div>
</div>
</li>
</ul>
@@ -81,6 +85,10 @@
</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"/>
@@ -96,7 +104,11 @@
<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>
<div>
<label for="archetypeAdvancedOptionsCollapsing"><archetype-localize key="enableCollapsing">Enable Collapsing?</archetype-localize><small><archetype-localize key="enableCollapsingDescription">Allows multiple types of fieldsets within this archetype.</archetype-localize></small></label>
<input type="checkbox" id="archetypeAdvancedOptionsCollapsing" ng-model="archetypeConfigRenderModel.enableCollapsing"/>
</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"/>
+42 -29
View File
@@ -1,44 +1,43 @@
<div class="archetypeEditor ng-class:model.config.customCssClass" ng-controller="Imulus.ArchetypeController">
<textarea class="archetypeDeveloperModel" ng-show="model.config.developerMode" ng-model="archetypeRenderModel"></textarea>
<div class="archetypeFieldsetToolbar" ng-show="model.config.fieldsets.length > 1 && model.config.hideFieldsetToolbar != '1'">
<ul>
<li ng-repeat="fieldsetModel in model.config.fieldsets" ng-click="addRow(fieldsetModel.alias)">
<i class="fieldsetIcon icon ng-class:fieldsetModel.icon"></i>
<span>{{fieldsetModel.label}}</span>
</li>
</ul>
</div>
<ul ui-sortable="sortableOptions" ng-model="archetypeRenderModel.fieldsets">
<li ng-repeat="fieldset in archetypeRenderModel.fieldsets" ng-hide="fieldset.remove">
<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="{archetypeFieldsetError: !fieldset.isValid}" ng-init="fieldsetConfigModel = getConfigFieldsetByAlias(fieldset.alias)">
<div class="archetypeFieldsetLabel">
<span class="caret" ng-hide="fieldset.collapse"></span>
<span class="caret caret-right" ng-show="fieldset.collapse"></span>
<label ng-click="focusFieldset(fieldset)">
<i class="fieldsetIcon icon ng-class:fieldsetConfigModel.icon"></i>
<span ng-bind="getFieldsetTitle(fieldsetConfigModel, $index)"></span>
</label>
<div class="archetypeEditorControls" ng-hide="model.config.hideFieldsetControls || model.config.maxFieldsets == '1'">
<i class="icon icon-add" ng-click="addRow(fieldset.alias, $index)" ng-show="canAdd()"></i>
<i class="icon icon-delete" ng-click="removeRow($index)" ng-show="canRemove()"></i>
<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>
<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-navigation handle" ng-show="canSort()"></i>
</div>
</div>
<div class="archetypeCollapser animate-hide" ng-hide="fieldset.collapse">
<div class="archetypeCollapser animate-hide" ng-hide="isCollapsed(fieldset)">
<form class="form-inline">
<div ng-class="{archetypePropertyError: getPropertyValidity($parent.$index, property.alias) === false}" class="archetypeProperty control-group" ng-repeat="property in fieldsetConfigModel.properties">
<label ng-hide="archetypeConfig.hidePropertyLabels == '1'" class="control-label" for="archetype-property-{{$parent.$index}}-{{$index}}">
<label ng-hide="archetypeConfig.hidePropertyLabels == '1'" class="control-label" for="archetype-property-{{model.alias}}-{{$parent.$index}}-{{$index}}">
<span>{{property.label}}</span>
<div class="archetypeFieldsetHelpText" ng-show="property.helpText">
<em>{{property.helpText}}</em>
<small>{{property.helpText}}</small>
</div>
</label>
<div class="controls">
<archetype-property class="archetypeEditor ng-class:property.alias" property="property" fieldset-index="$parent.$index" fieldset="fieldset" archetype-config="model.config" property-config-index="$index" archetype-render-model="archetypeRenderModel"></archetype-property>
<archetype-property class="archetypeEditor ng-class:property.alias" property="property" fieldset-index="$parent.$index" fieldset="fieldset" archetype-config="model.config" property-config-index="$index" archetype-render-model="model.value" umbraco-property-alias="model.alias" umbraco-form = "form"></archetype-property>
</div>
</div>
</form>
@@ -46,4 +45,18 @@
</fieldset>
</li>
</ul>
</div>
<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>
<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>
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "Archetype",
"version": "0.4.0-alpha",
"version": "1.0-beta",
"url": "http://github.com/imulus/archetype/",
"author": "Imulus",
"authorUrl": "http://imulus.com/",
@@ -12,9 +12,4 @@
<iconUrl>http://github.com/imulus/archetype/raw/master/assets/logo.png</iconUrl>
<licenseUrl><%= licenseUrl %></licenseUrl>
</metadata>
<files>
<% files.forEach(function(file) { %>
<file src="<%- file.path %>" target="<%= file.target %>" />
<% }); %>
</files>
</package>
+5 -3
View File
@@ -1,7 +1,7 @@
{
"name": "archetype",
"version": "0.0.0",
"devDependencies": {
"dependencies": {
"grunt": "~0.4.2",
"bower": "~1.2.8",
"grunt-contrib-copy": "~0.5.0",
@@ -18,9 +18,11 @@
"rimraf": "~2.2.5",
"grunt-nuget": "~0.1.1",
"grunt-template": "~0.2.2",
"grunt-touch": "~0.1.0",
"fs-extra": "~0.8.1",
"grunt-msbuild": "~0.1.9"
"grunt-msbuild": "~0.1.9",
"grunt-dotnet-assembly-info": "~1.0.9",
"load-grunt-tasks": "~0.4.0",
"grunt-umbraco-package": "0.0.5"
},
"repository": {
"type": "git",
-76
View File
@@ -1,76 +0,0 @@
module.exports = function(grunt) {
grunt.registerTask('umbracoPackage', 'Create Umbraco Package', function() {
grunt.config.requires('umbracoPackage.options.name');
grunt.config.requires('umbracoPackage.options.version');
grunt.config.requires('umbracoPackage.options.license');
grunt.config.requires('umbracoPackage.options.licenseUrl');
grunt.config.requires('umbracoPackage.options.url');
grunt.config.requires('umbracoPackage.options.author');
grunt.config.requires('umbracoPackage.options.authorUrl');
grunt.config.requires('umbracoPackage.options.manifest');
grunt.config.requires('umbracoPackage.options.readme');
grunt.config.requires('umbracoPackage.options.outputDir');
grunt.config.requires('umbracoPackage.options.sourceDir');
var Guid = require('guid');
var path = require('path');
var rimraf = require('rimraf');
var AdmZip = require('adm-zip');
var fs = require('fs-extra');
var options = this.options({
minimumUmbracoVersion: '',
files: [],
cwd: '/'
});
var packageFileName = options.name + "_" + options.version + ".zip"
// Gather files
var filesToPackage = [];
getFilesRecursive(options.sourceDir);
filesToPackage = filesToPackage.map(function(f) {
return { guid: Guid.create(), dir: f.dir.replace(options.sourceDir, ''), name: f.name, ext: f.name.split('.').pop() };
});
// Create temp folder for package zip source
var guidFolder = Guid.create().toString();
var newDirName = path.join(options.sourceDir, "..\\" + guidFolder);
fs.mkdirSync(newDirName);
newDirName = path.join(newDirName, guidFolder);
fs.mkdirSync(newDirName);
// Copy flatten structure, with files renamed as <guid>.<ext>
filesToPackage.forEach(function(f) {
var newFileName = f.name == "package.xml" ? f.name : f.guid.toString() + '.' + f.ext;
fs.copySync(path.join(options.sourceDir, f.dir, f.name), path.join(newDirName, newFileName));
});
// Load / transform XML Manifest
options.files = filesToPackage;
options.readmeContents = grunt.file.read(options.readme);
var manifest = grunt.file.read(options.manifest);
manifest = grunt.template.process(manifest, {data: options});
grunt.file.write(path.join(options.sourceDir, "..\\", guidFolder, guidFolder, "package.xml"), manifest); // TODO: Probably shouldn't use sourceDir - what if under source control
// Zip
var zip = new AdmZip();
zip.addLocalFolder(path.join(options.sourceDir, "..\\", guidFolder));
zip.writeZip(path.join(options.outputDir, packageFileName))
function getFilesRecursive(dir) {
var files = fs.readdirSync(dir);
for (var i in files) {
if (!files.hasOwnProperty(i)) continue;
var name = dir+'/'+files[i];
if (fs.statSync(name).isDirectory()) {
getFilesRecursive(name);
} else {
filesToPackage.push({ dir: dir, name: files[i]});
}
}
}
});
};