From 68ff77f5b66284ab4af85b42686ed7908bc3abcf Mon Sep 17 00:00:00 2001 From: TimoPerplex Date: Fri, 24 Jul 2015 16:27:26 +0200 Subject: [PATCH 01/27] This commit removes the hardcoded .jpg thumbnails This commit removes the hardcoded .jpg thumbnails and uses the image original extension to create the thumbnail. Because we now use the original extension the image is no longer masked as another (extension is .jpg but the file is actually a .png) This fixes issues with Internet Explorer used in combination with the no-sniff header. Ref topic: https://our.umbraco.org/forum/umbraco-7/using-umbraco-7/66788-adding-nosniff-header-breaks-png-images-in-internet-explorer --- src/Umbraco.Core/IO/UmbracoMediaFile.cs | 4 ++-- src/Umbraco.Core/Media/ImageHelper.cs | 18 ++++++++++++------ .../umbraco/plugins/tinymce3/insertImage.aspx | 2 +- src/Umbraco.Web/Editors/ImagesController.cs | 7 ++++--- .../ImageThumbnailProvider.cs | 2 +- .../controls/Images/ImageViewer.ascx.cs | 2 +- .../controls/Images/UploadMediaImage.ascx.cs | 2 +- .../umbraco/dialogs/imageViewer.aspx.cs | 2 +- .../umbraco/plugins/tinymce3/insertImage.aspx | 2 +- .../umbraco/uQuery/MediaExtensions.cs | 2 +- 10 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs index b8fe310f54..d708fcb804 100644 --- a/src/Umbraco.Core/IO/UmbracoMediaFile.cs +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -199,8 +199,8 @@ namespace Umbraco.Core.IO using (var image = Image.FromStream(fs)) { var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) - : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL." + Extension, Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) + : string.Format("{0}_{1}." + Extension, Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); var thumbnail = maxWidthHeight == -1 ? ImageHelper.GenerateThumbnail(image, width, height, fileNameThumb, Extension, _fs) diff --git a/src/Umbraco.Core/Media/ImageHelper.cs b/src/Umbraco.Core/Media/ImageHelper.cs index 5842bb67bb..9f5838fef5 100644 --- a/src/Umbraco.Core/Media/ImageHelper.cs +++ b/src/Umbraco.Core/Media/ImageHelper.cs @@ -122,8 +122,8 @@ namespace Umbraco.Core.Media private static ResizedImage Resize(IFileSystem fileSystem, string path, string extension, int maxWidthHeight, string fileNameAddition, Image originalImage) { var fileNameThumb = String.IsNullOrEmpty(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", path.Substring(0, path.LastIndexOf("."))) - : string.Format("{0}_{1}.jpg", path.Substring(0, path.LastIndexOf(".")), fileNameAddition); + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL." + extension, path.Substring(0, path.LastIndexOf("."))) + : string.Format("{0}_{1}." + extension, path.Substring(0, path.LastIndexOf(".")), fileNameAddition); var thumb = GenerateThumbnail( originalImage, @@ -202,10 +202,16 @@ namespace Umbraco.Core.Media // Copy metadata var imageEncoders = ImageCodecInfo.GetImageEncoders(); - - var codec = extension.ToLower() == "png" || extension.ToLower() == "gif" - ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) - : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); + var codec = imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); // default "jpg" + switch (extension.ToLower()) + { + case "png": codec = imageEncoders.Single(t => t.MimeType.Equals("image/png")); break; + case "gif": codec = imageEncoders.Single(t => t.MimeType.Equals("image/gif")); break; + case "tif": + case "tiff": codec = imageEncoders.Single(t => t.MimeType.Equals("image/tiff")); break; + case "bmp": codec = imageEncoders.Single(t => t.MimeType.Equals("image/bmp")); break; + default: break; + } // Set compresion ratio to 90% var ep = new EncoderParameters(); diff --git a/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx b/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx index 6388b243ee..21d18dd7ad 100644 --- a/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx +++ b/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx @@ -133,7 +133,7 @@ //get the thumb of the image var src = document.forms[0].src.value; var ext = src.split('.').pop(); - var thumb = src.replace("." + ext, "_thumb.jpg"); + var thumb = src.replace("." + ext, "_thumb." + ext); if (src != "") jQuery("#<%=ImageViewer.ClientID%>").UmbracoImageViewerAPI().showImage(thumb); } }, 500); diff --git a/src/Umbraco.Web/Editors/ImagesController.cs b/src/Umbraco.Web/Editors/ImagesController.cs index 54938be76d..18b30be1aa 100644 --- a/src/Umbraco.Web/Editors/ImagesController.cs +++ b/src/Umbraco.Web/Editors/ImagesController.cs @@ -124,7 +124,7 @@ namespace Umbraco.Web.Editors return Request.CreateResponse(HttpStatusCode.NotFound); } - var thumbFilePath = imagePath.TrimEnd(ext) + "_" + suffix + ".jpg"; + var thumbFilePath = imagePath.TrimEnd(ext) + "_" + suffix + ext; var fullOrgPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(imagePath)); var fullNewPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(thumbFilePath)); var thumbIsNew = mediaFileSystem.FileExists(fullNewPath) == false; @@ -148,7 +148,7 @@ namespace Umbraco.Web.Editors originalImage, width, fullNewPath, - "jpg", + ext.Replace(".", ""), mediaFileSystem); } else @@ -168,7 +168,8 @@ namespace Umbraco.Web.Editors if (stream.CanSeek) stream.Seek(0, 0); result.Content = new StreamContent(stream); result.Headers.Date = mediaFileSystem.GetLastModified(imagePath); - result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); + result.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(imagePath)); + return result; } } diff --git a/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs b/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs index a2777c0137..6f9b26c79d 100644 --- a/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs +++ b/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs @@ -33,7 +33,7 @@ namespace Umbraco.Web.Media.ThumbnailProviders return false; // Make sure the thumbnail exists - var tmpThumbUrl = fileUrl.Replace(ext, "_thumb.jpg"); + var tmpThumbUrl = fileUrl.Replace(ext, "_thumb" + ext); try { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs index eaf2eb5b82..98362dd638 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs @@ -110,7 +110,7 @@ namespace umbraco.controls.Images } string ext = MediaItemPath.Substring(MediaItemPath.LastIndexOf(".") + 1, MediaItemPath.Length - MediaItemPath.LastIndexOf(".") - 1); - MediaItemThumbnailPath = MediaItemPath.Replace("." + ext, "_thumb.jpg"); + MediaItemThumbnailPath = MediaItemPath.Replace("." + ext, "_thumb." + ext); ImageFound = true; } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs index 71b32f2b61..24d115c6d6 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs @@ -81,7 +81,7 @@ namespace umbraco.controls.Images //this seems real ugly since we apparently already have the properties above (props)... but this data layer is insane and undecipherable:) string mainImage = media.getProperty(Constants.Conventions.Media.File).Value.ToString(); string extension = mainImage.Substring(mainImage.LastIndexOf(".") + 1, mainImage.Length - mainImage.LastIndexOf(".") - 1); - var thumbnail = mainImage.Remove(mainImage.Length - extension.Length - 1, extension.Length + 1) + "_thumb.jpg"; + var thumbnail = mainImage.Remove(mainImage.Length - extension.Length - 1, extension.Length + 1) + "_thumb." + extension; string width = media.getProperty(Constants.Conventions.Media.Width).Value.ToString(); string height = media.getProperty(Constants.Conventions.Media.Height).Value.ToString(); int id = media.Id; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs index 3a2917f24f..f7f129dbed 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs @@ -76,7 +76,7 @@ namespace umbraco.dialogs } var fileNameOrg = fileName; var ext = fileNameOrg.Substring(fileNameOrg.LastIndexOf(".") + 1, fileNameOrg.Length - fileNameOrg.LastIndexOf(".") - 1); - var fileNameThumb = SystemDirectories.Root + fileNameOrg.Replace("." + ext, "_thumb.jpg"); + var fileNameThumb = SystemDirectories.Root + fileNameOrg.Replace("." + ext, "_thumb." + ext); image.Controls.Add(new LiteralControl("")); } catch diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx index 1ae2936713..7c4a878ee5 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx @@ -133,7 +133,7 @@ //get the thumb of the image var src = document.forms[0].src.value; var ext = src.split('.').pop(); - var thumb = src.replace("." + ext, "_thumb.jpg"); + var thumb = src.replace("." + ext, "_thumb." + ext); if (src != "") jQuery("#<%=ImageViewer.ClientID%>").UmbracoImageViewerAPI().showImage(thumb); } }, 500); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs index f52100d9c9..42b9cd757b 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs @@ -216,7 +216,7 @@ namespace umbraco if (!string.IsNullOrEmpty(url)) { var extension = media.GetProperty(Constants.Conventions.Media.Extension); - return url.Replace(string.Concat(".", extension), "_thumb.jpg", StringComparison.InvariantCultureIgnoreCase); + return url.Replace(string.Concat(".", extension), "_thumb." + extension, StringComparison.InvariantCultureIgnoreCase); } } From 9a99ed655a6a409d1456768ca1b904b5b8ce36dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20St=C3=B6cker?= Date: Fri, 25 Sep 2015 15:09:53 +0200 Subject: [PATCH 02/27] Major revamp with keys added and texts fixed everywhere Thanks to @merkledo and the others of the Stuttgart Umbraco Meetup, we pulled together all the bits and pieces for a single solid translation file. Even if not perfect it will still be better than everthing we had before and something we hopefully can keep current from now on. --- src/Umbraco.Web.UI/umbraco/config/lang/de.xml | 364 +++++++++--------- 1 file changed, 175 insertions(+), 189 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml index c6f87964e7..43775b3773 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml @@ -1,14 +1,14 @@ - - + + - The Umbraco community - http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + The German Umbraco community + Contributors welcome. Find us on Twitter: @merkledo, @SoerenDeger, @esn303, @thoehler Hostnamen verwalten Protokoll Durchsuchen - Dokumententyp ändern + Dokumenttyp ändern Kopieren Erstellen Paket erstellen @@ -24,9 +24,10 @@ Benachrichtigungen Öffentlicher Zugriff Veröffentlichen - Veröffentlichung zurück nehmen + Veröffentlichung zurücknehmen Aktualisieren Erneut veröffentlichen + Wiederherstellen Berechtigungen Zurücksetzen Zur Veröffentlichung einreichen @@ -35,15 +36,15 @@ Zur Veröffentlichung einreichen Übersetzen Aktualisieren - Standard Wert + Standardwert - Zugriff verweigert + Erlaubnis verweigert. Neue Domain hinzufügen - Entfernen - Ungültiges Element - Format der Domain ungültig - Die Domain ist bereits zugeordnet + entfernen + Ungültiges Element. + Format der Domain ungültig. + Domain wurde bereits zugewiesen. Sprache Domain Domain '%0%' hinzugefügt @@ -51,23 +52,20 @@ Die Domain '%0%' ist bereits zugeordnet Domain '%0%' aktualisiert Domains bearbeiten -
1-Level Pfade in Domains werden unterstützt, z.B. "example.com/en". Diese sollten aber nach Möglichkeit vermieden werden. Besser sollten - die Sprachkultur-Einstellungen verwendet werden.]]>
+ Beispiel: example.com, www.example.com Vererben - Sprachkultur - Definiert die Sprachkultureinstellung für untergeordnete Elemente dieses Elements oder vererbt vom übergeordneten Element. Wird auch auf das aktuelle Element angewendet, sofern auf tieferer Ebene keine Domain zugeordnet ist. - - Domains - + Kultur + Definiert die Kultureinstellung für untergeordnete Elemente dieses Elements oder vererbt vom übergeordneten Element. Wird auch auf das aktuelle Element angewendet, sofern auf tieferer Ebene keine Domain zugeordnet ist. + Domains + Ansicht für Auswählen - Verzeichnis wählen - Etwas anders machen - Fett + Aktuellen Ordner auswählen + Etwas anderes machen + Fett Ausrücken Formularelement einfügen Graphische Überschrift einfügen @@ -82,37 +80,37 @@ Aufzählung Nummerierung Makro einfügen - Bild einfügen + Abbildung einfügen Datenbeziehungen bearbeiten - Zürück zur Übersicht + Zurück zur Liste Speichern Speichern und veröffentlichen Speichern und zur Abnahme übergeben Vorschau - Die Vorschaufunktion ist deaktiviert, da keine Vorlage zugewiesen ist + Die Vorschaufunktion ist deaktiviert, da keine Vorlage zugewiesen ist Stil auswählen Stil anzeigen Tabelle einfügen - Um einen Dokumententyp zu ändern muss zunächst ein gültiger Dokumententyp in der Liste für diesen Inhalt ausgewählt werden. - Danach muss die Zuweisung der Eigenschaften vom aktuellen zum neuen Dokumententyp bestätigt und/oder geändert werden und auf Speichern geklickt werden. + Um den Typ des ausgewählten Dokuments zu ändern, wählen Sie bitte zunächst aus der Liste der an dieser Stelle erlaubten Dokumenttypen. + Im Anschluss bestätigen oder korrigieren Sie die Zuordnung der Eigenschaften und klicken Sie auf 'Speichern'. Der Inhalt wurde neu veröffentlicht. - Aktuelle Eigenschaft - Aktueller Doumententyp - Der Dokumententyp kann nicht geändert werden, da es keine alternativen gültigen Eigenschaften für dieses Dokument gibt. Eine Alternative wird gültig sein, wenn es unter dem übergeordenten Knoten des ausgewählten Dokuments erlaubt ist und alle bestehenden untergeordneten Dokumente unter diesem erstellt werden dürfen. - Dokumententyp ändern - Eigenschaften zuweisen - Zu Eigenschaft zuweisen + Derzeitige Eigenschaft + Derzeitiger Datentyp + Der Typ dieses Dokuments kann nicht geändert werden, da an dieser Stelle keine Alternativen zugelassen sind. Ein alternativer Dokumenttyp kann nur dann verwendet werden, wenn er unterhalb des diesem Dokument übergeordneten Elements angelegt werden darf. + Dokumenttyp geändert + Eigenschaften zuordnen + Dieser Eigenschaft zuordnen Neue Vorlage - Neue Eigenschaft - keine + Neuer Typ + keiner Inhalt - Neuen Dokumententyp auswählen - Der Dokumententyp des ausgewählten Dokuments wurde erfolgreich geändert zu [new type] und zu folgenden Eigenschaften zugewiesen: - zu - Zuweisung der Eigenschaft konnte nicht abgeschlossen werden, weil es eine oder mehr Eigenschaften mehr gibt als für eine Zuweisung definiert wurden. - Nur wecheselnde Eigenschaften sind gültig für das aktuell angezeigte Dokument. + Neuen Dokumenttyp auswählen + Der Typ des ausgewählten Dokuments wurde erfolgreich zu [new type] geändert und die Eigenschaften wie folgend zugeordnet: + nach + Die Zuordnung der Eigenschaften kann nicht abgeschlossen werden, da mindestens eine Eigenschaft mehrfach zugeordnet werden soll. + Nur an dieser Stelle erlaubte Dokumenttypen werden angezeigt. Ist veröffentlicht @@ -122,19 +120,19 @@ Alternative Links Klicken, um das Dokument zu bearbeiten Erstellt von - Ursprünglicher Author - Geändert von + Ursprünglicher Autor + Aktualisiert von Erstellt am - Erstellungszeitpunkt des Dokuments + Erstellungszeitpunkt des Dokuments Dokumenttyp In Bearbeitung Veröffentlichung aufheben am Dieses Dokument wurde nach dem Veröffentlichen bearbeitet. Dieses Dokument ist nicht veröffentlicht. Zuletzt veröffentlicht - Es gibt keine anzeigbaren Elemente in dieser Liste. + Diese Liste enthält keine Einträge. Medientyp - Link zu Medienobjekt(en) + Verweis auf Medienobjekt(e) Mitgliedergruppe Mitgliederrolle Mitglieder-Typ @@ -142,38 +140,42 @@ Name des Dokument Eigenschaften Dieses Dokument ist veröffentlicht aber nicht sichtbar, da das übergeordnete Dokument '%0%' nicht publiziert ist - Ups! Dieses Dokument ist veröffentlicht, aber befindet sich nicht im internen Cache (Systemfehler) + Ups! Dieses Dokument ist veröffentlicht aber nicht im internen Cache aufzufinden: Systemfehler. Veröffentlichen Publikationsstatus Veröffentlichen am - Veröffentlichung aufheben am + Veröffentlichung widerrufen am Datum entfernen Sortierung abgeschlossen Um die Dokumente zu sortieren, ziehen Sie sie einfach an die gewünschte Position. Sie können mehrere Zeilen markieren indem Sie die Umschalttaste ("Shift") oder die Steuerungstaste ("Strg") gedrückt halten Statistiken Titel (optional) - Alternativer Text (optional) + Alternativtext (optional) Typ - Veröffentlichung zurück nehmen + Veröffentlichung widerrufen Zuletzt bearbeitet am Letzter Änderungszeitpunkt des Dokuments Datei entfernen Link zum Dokument Mitglied der Gruppe(n) Kein Mitglied der Gruppe(n) - Untergeordnete Elemente - Ziel + Untergeordnete Elemente + Ziel - - Klicken zum Hochladen - Dateien hierher ziehen... + + Für Upload klicken + Dateien hier fallen lassen ... + + + Neues Mitglied anlegen + Alle Mitglieder An welcher Stellen wollen Sie das Element erstellen Erstellen unter Wählen Sie einen Namen und einen Typ - Es stehen keine erlaubten Dokumenttypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Dokumenttypen") aktivieren. - Es stehen keine erlaubten Medientypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Medientypen") aktivieren. + Es stehen keine erlaubten Dokumenttypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Dokumenttypen") aktivieren. + Es stehen keine erlaubten Medientypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Medientypen") aktivieren. Website anzeigen @@ -232,24 +234,22 @@ Bearbeiten Sie nachfolgend die verschiedenen Sprachversionen für den Wörterbucheintrag '<em>%0%</em>'. <br/>Unter dem links angezeigten Menüpunkt 'Sprachen' können Sie weitere hinzufügen. - Name der Sprachkultur - - - - -Benutzername eingeben - Passwort eingeben - Benenne %0%... - Name eingeben... - Suchbegriff eingeben... - Tippen zum Filtern... - Tippen für Schlagworte hinzuzufügen (drücke Enter nach jedem Schlagwort)... + Name der Kultur + + + Benutzername eingeben + Kennwort eingeben + %0% benennen ... + Name angeben ... + Durchsuchen ... + Filtern ... + Tippen, um Tags hinzuzufügen (nach jedem Tag die Eingabetaste drücken) ... - Als Wurzel-Knoten erlauben - Nur Dokumententype mit dieser Markierung können auf Ebene 1 im Inhalts- und Medienverzeichnisbaum erstellt werden + Auf oberster Ebene erlauben + Nur diese Dokumenttypen können auf oberster Ebene in Inhalte und Medien angelegt werden Dokumenttypen, die unterhalb dieses Typs erlaubt sind - Dokumententyp-Kompositionen + Zusammengesetzte Dokumenttypen Erstellen Registerkarte löschen Beschreibung @@ -257,11 +257,11 @@ Registerkarte Illustration Listenansicht aktivieren - Konfiguriert das Dokument zur Darstellung einer sortierbaren und durchsuchbaren Liste mit untergeordneten Dokumenten. Die untergeordneten Elemente werden im Verzeichnisbaum nicht mehr angezeigt. + Aktiviert eine durchsuch- und sortierbare Listendarstellung der untergeordneten Elemente anstelle diese in der Baumstruktur anzuzeigen Aktuelle Listenansicht - Datentyp der aktiven Listenansicht - Erstelle benutzerdefinierte Listenansicht - Entferne benutzerdefinierte Listenansicht + Der Datentyp für die aktuelle Ansicht der Liste + Angepasste Listenansicht erstellen + Angepasste Listenansicht entfernen Vorgabewert hinzufügen @@ -290,6 +290,7 @@ '%0%' hat ein falsches Format + Dieser Dateityp wird durch die Systemeinstellungen blockiert ACHTUNG! Obwohl CodeMirror in den Einstellungen aktiviert ist, bleibt das Modul wegen mangelnder Stabilität in Internet Explorer deaktiviert. Bitte geben Sie die Bezeichnung und den Alias des neuen Dokumenttyps ein. Es besteht ein Problem mit den Lese-/Schreibrechten auf eine Datei oder einen Ordner @@ -305,7 +306,7 @@ Sie können keine Zelle trennen, die nicht zuvor aus mehreren zusammengeführt wurde. Fehler im XSLT Das XSLT ist fehlerhaft und wurde daher nicht gespeichert. - Dieser Dateityp wird durch die Systemeinstellungen blockiert + Es liegt ein Konfigurationsfehler beim Datentyp dieser Eigenschaft vor. Bitte prüfen Sie den Datentyp bzw. die Eigenschaft. Info @@ -380,7 +381,7 @@ Verbleibend Umbenennen Erneuern - Pflichtangaben + Pflichtangabe Wiederholen Berechtigungen Suchen @@ -390,7 +391,7 @@ Größe Sortieren Typ - nach Inhalten suchen ... + Durchsuchen ... nach oben Aktualisieren Update @@ -406,9 +407,6 @@ Ordner Suchergebnisse - - - Hintergrundfarbe Fett @@ -438,7 +436,7 @@ Keine Sorge - Dabei werden keine Inhalte gelöscht und alles wird weiterhin funktionieren! </p> -Die Datenbank wurde auf die Version %0% aktualisiert. Klicken Sie auf <strong>weiter</strong>, um fortzufahren. + Die Datenbank wurde auf die Version %0% aktualisiert. Klicken Sie auf <strong>weiter</strong>, um fortzufahren. Die Datenbank ist fertig eingerichtet. Klicken Sie auf <strong>"weiter"</strong>, um mit der Einrichtung fortzufahren. <strong>Das Kennwort des Standard-Benutzers muss geändert werden!</strong> <strong>Der Standard-Benutzer wurde deaktiviert oder hat keinen Zugriff auf Umbraco.</strong></p><p>Es sind keine weiteren Aktionen notwendig. Klicken Sie auf <b>Weiter</b> um fortzufahren. @@ -514,8 +512,8 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Dieser Assistent führt Sie durch die Einrichtung einer neuen Installation von <strong>Umbraco %0%</strong> oder einem Upgrade von Version 3.0.<br /><br />Klicken Sie auf <strong>weiter</strong>, um zu beginnen. - Code der Sprachkultur - Name der Sprachkultur + Code der Kultur + Name der Kultur Sie haben keine Tätigkeiten mehr durchgeführt und werden automatisch abgemeldet in @@ -523,18 +521,18 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Einen wunderbaren Sonntag - Frohen freundlichen Freitag - Donnerwetter Donnerstag Schönen Montag Einen großartigen Dienstag Wunderbaren Mittwoch + Donnerwetter Donnerstag + Frohen freundlichen Freitag Wunderbaren sonnigen Samstag Hier anmelden: - Die Sitzung ist abgelaufen - <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">umbraco.org</a></p> + Sitzung abgelaufen + <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">umbraco.org</a></p> - Armaturenbrett + Dashboard Bereiche Inhalt @@ -548,9 +546,9 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Es ist noch kein Element ausgewählt. Bitte wählen Sie ein Element aus der Liste aus, bevor Sie fortfahren. Das aktuelle Element kann aufgrund seines Dokumenttyps nicht an diese Stelle verschoben werden. Das ausgewählte Element kann nicht zu einem seiner eigenen Unterelemente verschoben werden. + Dieses Element kann nicht auf der obersten Ebene platziert werden. Diese Aktion ist nicht erlaubt, da Sie unzureichende Berechtigungen für mindestens ein untergeordnetes Element haben. Kopierte Elemente mit dem Original verknüpfen - Dieses Element kann nicht auf der obersten Ebene platziert werden. Bearbeiten Sie Ihre Benachrichtigungseinstellungen für '%0%' @@ -565,8 +563,7 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Ihr freundlicher Umbraco-Robot -Hi %0%

- +Hallo %0%

Dies ist eine automatisch E-Mail, welche Sie informiert, dass die Aufgabe '%1%' an der Seite '%2%' vom Benutzer '%3%' ausgeführt wurde. @@ -591,7 +588,8 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die

Einen schönen Tag wünscht

Ihr freundlicher Umbraco-Robot -

]]> +

+]]>
[%0%] Benachrichtigung: %1% ausgeführt an Seite '%2%' Benachrichtigungen @@ -619,8 +617,8 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Hinweise für die Durchführung des Updates Es ist ein Update für dieses Paket verfügbar. Sie können es direkt vom Umbraco-Paket-Repository herunterladen. Version des Pakets - Paket-Webseite aufrufen Versionsverlauf des Pakets + Paket-Webseite aufrufen Einfügen mit Formatierung (Nicht empfohlen) @@ -647,7 +645,10 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Wenn Sie einen einfachen Zugriffsschutz unter Verwendung eines einzelnen Logins mit Kennwort aktivieren wollen + %0% kann nicht veröffentlicht werden, da die Veröffentlichung zeitlich geplant ist. + %0% konnte nicht veröffentlicht werden, da einige Daten die Gültigkeitsprüfung nicht bestanden haben. %0% konnte nicht veröffentlicht werden, da ein Plug-In die Aktion abgebrochen hat. + %0% kann nicht veröffentlicht werden, da das übergeordnete Dokument nicht veröffentlicht ist. Unveröffentlichte Unterelemente einschließen Bitte warten, Veröffentlichung läuft... %0% Elemente veröffentlicht, %1% Elemente ausstehend ... @@ -655,22 +656,22 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die %0% und die untergeordneten Elemente wurden veröffentlicht %0% und alle untergeordneten Elemente veröffentlichen Mit <em>Ok</em> wird <strong>%0%</strong> veröffentlicht und auf der Website sichtbar.<br/><br />Sie können dieses Element mitsamt seinen untergeordneten Elementen veröffentlichen, indem Sie <em>Unveröffentlichte Unterelemente einschließen</em> aktivieren. - %0% konnte nicht veröffentlicht werden, da einige Daten die Gültigkeitsprüfung nicht bestanden haben. - %0% kann nicht veröffentlicht werden, da das übergeordnete Dokument nicht veröffentlicht ist. - %0% kann nicht veröffentlicht werden, da die Veröffentlichung zeitlich geplant ist. + + + Sie haben keine freigegeben Farben konfiguriert - Externer Link eingeben - Interne Seite auswählen - Link hinzufügen + Externen Link eingeben + Internen Link auswählen Beschriftung - In neuem Fenster öffnen - Neue Beschriftung eingeben - Link eingeben - - - Zurücksetzen - + Link + In neuem Fenster öffnen + Bezeichnung eingeben + Link eingeben + + + Zurücksetzen + Aktuelle Version Zeigt die Unterschiede zwischen der aktuellen und der ausgewählten Version an.<br />Text in <del>rot</del> fehlen in der ausgewählten Version, <ins>grün</ins> markierter Text wurde hinzugefügt. @@ -696,9 +697,15 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Statistiken Übersetzung Benutzer - Umbraco Forms - Hilfe - Analytics + Hilfe + Formulare + Auswertungen + + + go to + Hilfethemen zu + Video-Tutorials für + Die besten Umbraco-Video-Tutorials Standardvorlage @@ -708,17 +715,17 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Elementtyp Typ Stylesheet + Skript Stylesheet-Eigenschaft - Skript Registerkarte Registerkartenbeschriftung Registerkarten - Dieser Dokumenttyp verwendet Masterdokumenttyp aktiviert + Dieser Dokumenttyp verwendet als Masterdokumenttyp. Register vom Masterdokumenttyp werden nicht angezeigt und können nur im Masterdokumenttyp selbst bearbeitet werden Für dieses Register sind keine Eigenschaften definiert. Klicken Sie oben auf "neue Eigenschaft hinzufügen", um eine neue Eigenschaft hinzuzufügen. - Master Dokumententyp - Erstelle zugehörige Vorlage + Masterdokumenttyp + Zugehörige Vorlage anlegen Sortierung abgeschlossen. @@ -726,6 +733,10 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Bitte warten, die Seiten werden sortiert. Das kann einen Moment dauern. Bitte schließen Sie dieses Fenster nicht, bis der Sortiervorgang abgeschlossen ist. + Fehlgeschlagen + Unzureichende Benutzerberechtigungen. Vorgang kann nicht abgeschlossen werden. + Abgebrochen + Vorgang wurde durch eine benutzerdefinierte Erweiterung abgebrochen Das Veröffentlichen wurde von einem individuellen Ereignishandler abgebrochen Eigenschaft existiert bereits Eigenschaft erstellt @@ -742,17 +753,20 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Wörterbucheintrag gespeichert Veröffentlichung nicht möglich, da das übergeordnete Dokument nicht veröffentlicht ist. Inhalte veröffentlicht - und sichtbar auf der Webseite + Sichtbar auf der Webseite Inhalte gespeichert - Denken Sie daran die Inhalte zu veröffentlichen, um die Änderungen sichtbar zu machen + Denken Sie daran, die Inhalte zu veröffentlichen, um die Änderungen sichtbar zu machen Zur Abnahme eingereicht Die Änderungen wurden zur Abnahme eingereicht + Medium gespeichert + Medium fehlerfrei gespeichert Mitglied gespeichert Stylesheet-Regel gespeichert Stylesheet gespeichert Vorlage gespeichert Fehler beim Speichern des Benutzers. Benutzer gespeichert + Benutzertyp gepsichert Datei wurde nicht gespeichert Datei konnte nicht gespeichert werden. Bitte überprüfen Sie die Schreibrechte auf Dateiebene. Datei gespeichert @@ -771,14 +785,16 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die XSLT kann nicht gespeichert werden. Bitte überprüfen Sie die Schreibrechte auf Dateiebene. XSLT gespeichert Keine Fehler im XSLT - Medium gespeichert Veröffentlichung des Inhalts aufgehoben Partielle Ansicht gespeichert Partielle Ansicht ohne Fehler gespeichert. Partielle Ansicht nicht gespeichert Fehler beim Speichern der Datei. - Benutzertyp gepsichert - Medium fehlerfrei gespeichert + Skript gespeichert + Skript fehlerfrei gespeichert! + Skript nicht gespeichert + Fehler beim Speichern der Datei. + Fehler beim Speichern der Datei. Gewünschter CSS-Selektor, zum Beispiel 'h1', '.bigHeader' oder 'p.infoText' @@ -800,68 +816,40 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Vorlage - Typ auswählen - Wählen Sie ein Layout für diese Seite - und fügen Sie ihr erstes Element hinzu.]]> - - Klicken zum Einfügen - Klicken zum Bild Einfügen - Bildbeschriftung... - Schreibe hier... - - Grid Layouts - Layouts sind der gesamte Arbeitsbereich des Grid Editors. Sie brauchen aber meistens nur ein oder zwei unterschiedliche Layouts. - Grid Layout hinzufügen - Layout einstellen (Spaltenbreite festlegen und zusätzliche Bereiche hinzufügen) - - Zeilenkonfiguration - Zeilen sind vordefinierte und horizontal angeordnete Zellen - Zeilenkonfiguration hinzufügen - Zeilen einstellen (Zellenbreite festlegen und zusätzliche Zellen hinzufügen) - + Element hinzufügen + Zeilenlayout auswählen + Einfach auf <i class="icon icon-add blue"></i> klicken, um das erste Element anzulegen + Klicken, um Inhalt einzubetten + Klicken, um Abbildung einzufügen + Beschriftung ... + Hier schreiben ... + Layouts + Layouts sind die grundlegenden Arbeitsflächen für das Gestaltungsraster. Üblicherweise sind nicht mehr als ein oder zwei Layouts nötig. + Layout hinzufügen + Passen Sie das Layout an, indem Sie die Spaltenbreiten einstellen und Abschnitte hinzufügen. + Einstellungen für das Zeilenlayout + Zeilen sind vordefinierte horizontale Zellenanordnungen + Zeilenlayout hinzufügen + Pasen Sie das Zeilenlayout an, indem Sie die Zellenbreite einstellen und Zellen hinzufügen. Spalten - Gesamtanzahl von allen kombinierten Spalten im Grid Layout - + Insgesamte Spaltenanzahl im Layout Einstellungen - Konfiguriere, welche Einstellungen der Editor ändern kann - - - Stilangaben - Konfiguriere, welche Stilangaben Editoren ändern können - - Einstellungen werden nur mit eingetragener und gültiger JSON Konfiguration gespeichert - - Allen Editoren erlauben - Alle Zeilenkonfigurationen erlauben + Legen Sie fest, welche Einstellungen die Autoren anpassen können. + CSS-Stile + Legen Sie fest, welche Stile die Autoren anpassen können. + Die Einstellungen werden nur gespeichert, wenn die angegebene JSON-Konfiguration gültig ist. + Alle Elemente erlauben + Alle Zeilenlayouts erlauben - - - - - - - - - - - - - - - - - - - - - - + Alternatives Feld Alternativer Text Groß- und Kleinschreibung + Kodierung Feld auswählen Zeilenumbrüche ersetzen Ersetzt Zeilenumbrüche durch das HTML-Tag <br /> + Benutzerdefinierte Felder nur Datum Als Datum formatieren HTML kodieren @@ -875,15 +863,13 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Rekursiv Textabsatz entfernen Alle <p> am Anfang und am Ende des Feldinhalts werden entfernt + Standardfelder Großbuchstaben URL kodieren Wandelt Sonderzeichen zur Verwendung in URLs um Wird nur verwendet, wenn beide vorgenannten Felder leer sind Dieses Feld wird nur verwendet, wenn das primäre Feld leer ist Datum und Zeit mit Trennzeichen: - Benutzerdefinierte Felder - Standardfelder - Kodierung Ihre Aufgaben @@ -941,7 +927,7 @@ Ihr freundlicher Umbraco-Robot Mitgliedergruppen Mitgliederrollen Mitglieder-Typen - Dokumententypen + Dokumenttypen Pakete Pakete Python-Dateien @@ -953,7 +939,7 @@ Ihr freundlicher Umbraco-Robot Stylesheets Vorlagen XSLT-Dateien - Analysen + Auswertungen Neues Update verfügbar @@ -964,10 +950,10 @@ Ihr freundlicher Umbraco-Robot Administrator Feld für Kategorie - Passwort ändern - Neues Passwort - Neues Kennwort (Bestätigung) - Sie können Ihr Kennwort für den Zugriff auf den Umbraco-Verwaltungsbereich ändern, indem Sie das nachfolgende Formular ausfüllen und auf die 'Kennwort ändern'-Schaltfläche klicken + Kennwort ändern + Neues Kennwort + Neues Kennwort (Bestätigung) + Sie können Ihr Kennwort für den Zugriff auf den Umbraco-Verwaltungsbereich ändern, indem Sie das nachfolgende Formular ausfüllen und auf 'Kennwort ändern' klicken Schnittstelle für externe Editoren Feld für Beschreibung Benutzer endgültig deaktivieren @@ -983,12 +969,12 @@ Ihr freundlicher Umbraco-Robot Kennwort zurücksetzen Ihr Kennwort wurde geändert! Bitte bestätigen Sie das neue Kennwort - Aktuelle Kennwort - Ungültig aktuelle Kennwort Geben Sie Ihr neues Kennwort ein Ihr neues Kennwort darf nicht leer sein! + Aktuelles Kennwort + Aktuelles Kennwort falsch Ihr neues Kennwort und die Wiederholung Ihres neuen Kennworts stimmen nicht überein. Bitte versuchen Sie es erneut! - Die Wiederholung Ihres Kennworts stimmt nicht mit dem neuen Kennwort überein! + Die Bestätigung Ihres Kennworts stimmt nicht mit dem angegebenen neuen Kennwort überein! Die Berechtigungen der untergeordneten Elemente ersetzen Die Berechtigungen für folgende Seiten werden angepasst: Dokumente auswählen, um deren Berechtigungen zu ändern @@ -999,9 +985,9 @@ Ihr freundlicher Umbraco-Robot Rolle Rollen Autor - Übersetzer - Ihr Profil - Ihr Verlauf - Sitzung läuft ab in + Übersetzer + Ihr Profil + Ihr Verlauf + Sitzung läuft ab in
From 95a9e4b5ffc273de67a85c97506da56d08923b4b Mon Sep 17 00:00:00 2001 From: TimoPerplex Date: Tue, 27 Oct 2015 13:09:21 +0100 Subject: [PATCH 03/27] Latest --- src/Umbraco.Web.UI/Umbraco/umbraco.aspx | 2 - src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs | 19 --------- .../Umbraco/umbraco.aspx.designer.cs | 15 ------- src/Umbraco.Web.UI/umbraco/Logout.aspx | 42 ------------------- 4 files changed, 78 deletions(-) delete mode 100644 src/Umbraco.Web.UI/Umbraco/umbraco.aspx delete mode 100644 src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs delete mode 100644 src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs delete mode 100644 src/Umbraco.Web.UI/umbraco/Logout.aspx diff --git a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx deleted file mode 100644 index c90ca1da73..0000000000 --- a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx +++ /dev/null @@ -1,2 +0,0 @@ -<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="umbraco.aspx.cs" Inherits="Umbraco.Web.UI.Umbraco.umbraco" %> - diff --git a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs deleted file mode 100644 index 91bc61dc6f..0000000000 --- a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using Umbraco.Core.Configuration; - -namespace Umbraco.Web.UI.Umbraco -{ - public partial class umbraco : System.Web.UI.Page - { - protected void Page_Load(object sender, EventArgs e) - { - Response.Status = "301 Moved Permanently"; - Response.AddHeader("Location", GlobalSettings.Path); - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs deleted file mode 100644 index e98415eb53..0000000000 --- a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs +++ /dev/null @@ -1,15 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Umbraco.Web.UI.Umbraco { - - - public partial class umbraco { - } -} diff --git a/src/Umbraco.Web.UI/umbraco/Logout.aspx b/src/Umbraco.Web.UI/umbraco/Logout.aspx deleted file mode 100644 index 2b6ec88946..0000000000 --- a/src/Umbraco.Web.UI/umbraco/Logout.aspx +++ /dev/null @@ -1,42 +0,0 @@ -<%@ Page Language="C#" %> -<%@ Import Namespace="Umbraco.Core" %> -<%@ Import Namespace="Umbraco.Core.IO" %> -<%@ Import Namespace="Umbraco.Web" %> - - - - - - - - Logout - - - - - From 43baba1733a24be4fe655e3d98d79f51cb30b197 Mon Sep 17 00:00:00 2001 From: TimoPerplex Date: Tue, 27 Oct 2015 13:10:25 +0100 Subject: [PATCH 04/27] Revert "Latest" This reverts commit 95a9e4b5ffc273de67a85c97506da56d08923b4b. --- src/Umbraco.Web.UI/Umbraco/umbraco.aspx | 2 + src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs | 19 +++++++++ .../Umbraco/umbraco.aspx.designer.cs | 15 +++++++ src/Umbraco.Web.UI/umbraco/Logout.aspx | 42 +++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 src/Umbraco.Web.UI/Umbraco/umbraco.aspx create mode 100644 src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs create mode 100644 src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs create mode 100644 src/Umbraco.Web.UI/umbraco/Logout.aspx diff --git a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx new file mode 100644 index 0000000000..c90ca1da73 --- /dev/null +++ b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx @@ -0,0 +1,2 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="umbraco.aspx.cs" Inherits="Umbraco.Web.UI.Umbraco.umbraco" %> + diff --git a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs new file mode 100644 index 0000000000..91bc61dc6f --- /dev/null +++ b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using Umbraco.Core.Configuration; + +namespace Umbraco.Web.UI.Umbraco +{ + public partial class umbraco : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + Response.Status = "301 Moved Permanently"; + Response.AddHeader("Location", GlobalSettings.Path); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs new file mode 100644 index 0000000000..e98415eb53 --- /dev/null +++ b/src/Umbraco.Web.UI/Umbraco/umbraco.aspx.designer.cs @@ -0,0 +1,15 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Umbraco.Web.UI.Umbraco { + + + public partial class umbraco { + } +} diff --git a/src/Umbraco.Web.UI/umbraco/Logout.aspx b/src/Umbraco.Web.UI/umbraco/Logout.aspx new file mode 100644 index 0000000000..2b6ec88946 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/Logout.aspx @@ -0,0 +1,42 @@ +<%@ Page Language="C#" %> +<%@ Import Namespace="Umbraco.Core" %> +<%@ Import Namespace="Umbraco.Core.IO" %> +<%@ Import Namespace="Umbraco.Web" %> + + + + + + + + Logout + + + + + From 07c714fd11d7eb37f97fec3e24ccf44617329a11 Mon Sep 17 00:00:00 2001 From: engern Date: Sat, 21 Nov 2015 11:33:46 +0100 Subject: [PATCH 05/27] Fixes U4-7424 Add the possibilty to change the error message when a macro partial view fails to render. --- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 1 + src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml | 1 + src/Umbraco.Web/umbraco.presentation/macro.cs | 9 ++++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 582bb077ef..7ffa57eaec 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -301,6 +301,7 @@ NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough. Please fill both alias and name on the new property type! There is a problem with read/write access to a specific file or folder + Error loading Partial View script (file: %0%) Please enter a title Please choose a type You're about to make the picture larger than the original size. Are you sure that you want to proceed? diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index c9dcd1554a..b5a686eec1 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -302,6 +302,7 @@ NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough. Please fill both alias and name on the new property type! There is a problem with read/write access to a specific file or folder + Error loading Partial View script (file: %0%) Please enter a title Please choose a type You're about to make the picture larger than the original size. Are you sure that you want to proceed? diff --git a/src/Umbraco.Web/umbraco.presentation/macro.cs b/src/Umbraco.Web/umbraco.presentation/macro.cs index 53bdaaa9de..4797709fde 100644 --- a/src/Umbraco.Web/umbraco.presentation/macro.cs +++ b/src/Umbraco.Web/umbraco.presentation/macro.cs @@ -24,6 +24,7 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Macros; using Umbraco.Core.Models; +using Umbraco.Core.Services; using Umbraco.Core.Xml.XPath; using Umbraco.Core.Profiling; using umbraco.interfaces; @@ -322,7 +323,13 @@ namespace umbraco Exception = e, Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - return GetControlForErrorBehavior("Error loading Partial View script (file: " + ScriptFile + ")", macroErrorEventArgs); + + var errorMessage = ApplicationContext.Current.Services.TextService.Localize("errors/macroErrorLoadingPartialView",new[]{ScriptFile}); + if (errorMessage.Equals("[macroErrorLoadingPartialView]")) // This check can be removed when key is added to every language file + { + errorMessage = "Error loading Partial View script (file: " + ScriptFile + ")"; + } + return GetControlForErrorBehavior(errorMessage, macroErrorEventArgs); }; using (DisposableTimer.DebugDuration("Executing Partial View: " + Model.TypeName)) From 0370f9a1c867e1a769f91b8cd9e1778b68495847 Mon Sep 17 00:00:00 2001 From: Tor-Erik Klausen Date: Wed, 2 Dec 2015 20:09:06 +0100 Subject: [PATCH 06/27] Update Norwegian translations Adds missing translations and removes some old ones. Based on current en.xml --- src/Umbraco.Web.UI/umbraco/config/lang/no.xml | 377 ++++++++++++------ 1 file changed, 260 insertions(+), 117 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml index f5d5fe9773..d877cdc3c5 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml @@ -1,4 +1,4 @@ - + The Umbraco community @@ -8,6 +8,7 @@ Angi domene Revisjoner Bla gjennom + Skift dokumenttype Kopier Opprett Opprett pakke @@ -15,16 +16,18 @@ Deaktiver Tøm papirkurv Eksporter dokumenttype - Importer documenttype + Importer dokumenttype Importer pakke Rediger i Canvas - Lukk Umbraco + Logg av Flytt - Varsling + Varslinger Offentlig tilgang Publiser + Avpubliser Oppdater noder Republiser hele siten + Gjenopprett Rettigheter Reverser Send til publisering @@ -33,32 +36,35 @@ Send til publisering Oversett Oppdater - Avpubliser + Standard verdi - Legg til domene - Domene - Domene '%0%' er nå opprettet og tilknyttet siden - Domenet '%0%' er nå slettet - Domenet '%0%' er allerede tilknyttet - Gyldige domenenavn er: "eksempel.no", "www.eksempel.no", "eksempel.no:8080" eller "https://www.eksempel.no/".<br/><br/>Stier med ett nivå støttes, f.eks. "eksempel.com/no". Imidlertid bør det unngås. Bruk heller språkinnstillingen over. - Domenet '%0%' er nå oppdatert - eller rediger eksisterende domener Ingen tilgang. + Legg til domene Fjern Ugyldig node. Ugyldig domeneformat. Domene er allerede tilknyttet. Språk + Domene + Domene '%0%' er nå opprettet og tilknyttet siden + Domenet '%0%' er nå slettet + Domenet '%0%' er allerede tilknyttet + Domenet '%0%' er nå oppdatert + eller rediger eksisterende domener +
Stier med ett nivå støttes, f.eks. "eksempel.com/no". Imidlertid bør det unngås. Bruk heller språkinnstillingen over.]]>
Arv Språk - Sett språk for underordnede noder eller arv språk fra overordnet.<br/>Vil også gjelde denne noden, med mindre et underordnet domene også gjelder. + Vil også gjelde denne noden, med mindre et underordnet domene også gjelder.]]> Domener Viser for + Velg + Velg gjeldende mappe + Gjør noe annet Fet Reduser innrykk Sett inn skjemafelt @@ -76,30 +82,57 @@ Sett inn makro Sett inn bilde Rediger relasjoner + Tilbake til listen Lagre Lagre og publiser Lagre og send til publisering Forhåndsvis + Forhåndsvisning er deaktivert siden det ikke er angitt noen mal Velg formattering Vis stiler Sett inn tabell - Forhåndsvisning er deaktivert siden det ikke er angitt noen mal + + + For å endre det valge innholdets dokumenttype, velger du først en ny dokumenttype som er gyldig på gjeldende plassering. + Kontroller deretter at alle egenskaper blir overført riktig til den nye dokumenttypen og klikk på Lagre. + Innholdet har blitt republisert. + Nåværende egenskap + Nåværende type + Du kan ikke endre dokumenttype, ettersom det ikke er andre gyldige dokumenttyper på denne plasseringen. + Dokumenttype endret + Overfør egenskaper + Overfør til egenskap + Ny mal + Ny type + ingen + Innhold + Velg ny dokumenttype + Dokumenttypen på det valgte innhold ble endret til [new type], og følgende egenskaper ble overført: + til + Overføringen av egenskaper kunne ikke fullføres da en eller flere egenskaper er satt til å bli overført mer enn en gang. + Kun andre dokumenttyper som er gyldige for denne plasseringen vises. + Publisert Om siden - Alternativ lenke + Alias (hvordan du ville beskrevet bildet over telefon) Alternative lenker Klikk for å redigere denne noden Opprettet av + Opprinnelig forfatter + Oppdatert av Opprettet den + Tidspunkt for opprettelse Dokumenttype Redigerer Utløpsdato Denne noden er endret siden siste publisering Denne noden er enda ikke publisert Sist publisert + Det er ingen elementer å vise i listen. Mediatype + Link til media Medlemsgruppe Rolle Medlemstype @@ -107,26 +140,42 @@ Sidetittel Egenskaper Dette dokumentet er publisert, men ikke synlig ettersom den overliggende siden '%0%' ikke er publisert + Intern feil: dokumentet er publisert men finnes ikke i hurtigbuffer Publisert Publiseringsstatus Publiseringsdato + Dato for avpublisering Fjern dato Sorteringsrekkefølgen er oppdatert Trekk og slipp nodene eller klikk på kolonneoverskriftene for å sortere. Du kan velge flere noder ved å holde shift eller control tastene mens du velger. Statistikk Tittel (valgfri) + Alternativ tekst (valgfri) Type Avpubliser Sist endret + Tidspunkt for siste endring Fjern fil Lenke til dokument - Link til media - Intern feil: dokumentet er publisert men finnes ikke i hurtigbuffer + Medlem av gruppe(ne) + Ikke medlem av gruppe(ne) + Undersider + Åpne i vindu + + + Klikk for å laste opp + Slipp filene her... + + + Opprett et nytt medlem + Alle medlemmer Hvor ønsker du å oprette den nye %0% Opprett under Velg en type og skriv en tittel + "dokumenttyper".]]> + "mediatyper".]]> Til ditt nettsted @@ -168,7 +217,7 @@ Innholdet i papirkurven blir nå slettet. Vennligst ikke lukk dette vinduet mens denne operasjonen foregår Papirkurven er nå tom Når elementer blir slettet fra papirkurven vil de være slettet for alltid - <a target='_blank' href='http://regexlib.com'>regexlib.com</a> tjenesten opplever for tiden problemer som vi ikke har kontroll over. Vi beklager denne ubeleiligheten. + regexlib.com tjenesten opplever for tiden problemer som vi ikke har kontroll over. Vi beklager denne ubeleiligheten.]]> Søk etter et regulært uttrykk for å legge inn validering til et felt. Eksempel: 'email, 'zip-code' 'url' Fjern makro Obligatorisk @@ -177,24 +226,42 @@ Hurtigbufferen for siden vil bli oppdatert. Alt publisert innhold vil bli oppdatert, mens upublisert innhold vil forbli upublisert. Antall kolonner Antall rader - <strong>Sett en plassholder-ID</strong><br/>Ved å sette en ID på plassholderen kan du legge inn innhold i denne malen fra underliggende maler, ved å referere denne ID'en ved hjelp av et <code>&lt;asp:content /&gt;</code> element. - <strong>Velg en plassholder ID</strong> fra listen under. Du kan bare velge ID'er fra den gjeldende malens overordnede mal. + Sett en plassholder-ID
Ved å sette en ID på plassholderen kan du legge inn innhold i denne malen fra underliggende maler, ved å referere denne ID'en ved hjelp av et <asp:content /> element.]]>
+ Velg en plassholder ID fra listen under. Du kan bare velge ID'er fra den gjeldende malens overordnede mal.]]> Klikk på bildet for å se det i full størrelse Velg punkt Se buffret node - Rediger de forskjellige språkversjonene for ordbokelementet '<em>%0%</em>' under.<br/>Du kan legge til flere språk under 'språk' i menyen til venstre. + %0%' under.
Du kan legge til flere språk under 'språk' i menyen til venstre.]]>
Språk + + Skriv inn ditt brukernavn + Skriv inn ditt passord + Navngi %0%... + Skriv inn navn... + Søk... + Filtrer... + Skriv inn nøkkelord (trykk på Enter etter hvert nøkkelord)... + + Tillat på rotnivå + Kun dokumenttyper med denne innstillingen aktivert kan opprettes på rotnivå under Innhold og Mediearkiv Tillatte underordnede noder + Sammensetting av dokumenttyper Opprett Slett arkfane Beskrivelse Ny arkfane Arkfane Miniatyrbilde + Aktiver listevisning + Viser undersider i en søkbar liste, undersider vises ikke i innholdstreet + Gjeldende listevisning + Den aktive listevisningsdatatypen + Opprett brukerdefinert listevisning + Fjern brukerdefinert listevisning Legg til forhåndsverdi @@ -223,6 +290,7 @@ %0% er ikke i et korrekt format + Filtypen er deaktivert av administrator NB! Selv om CodeMirror er aktivert i konfigurasjon er det deaktivert i Internet Explorer pga. ustabilitet. Fyll ut både alias og navn på den nye egenskapstypen! Det er et problem med lese/skrive rettighetene til en fil eller mappe @@ -238,16 +306,17 @@ Du kan ikke dele en celle som allerede er delt. Feil i XSLT kode XSLT ble ikke lagret på grunn av feil i koden - Filtypen er deaktivert av administrator + Det er et problem dem datatypen som brukes til denne egenskapen. Kontroller innstillingene og prøv igjen. Om Handling + Muligheter Legg til Alias Er du sikker? Ramme - eller + av Avbryt Cellemargin Velg @@ -292,6 +361,7 @@ Logg ut Makro Flytt + Mer Navn Ny Neste @@ -311,6 +381,7 @@ Gjenværende Gi nytt navn Forny + Påkrevd Prøv igjen Rettigheter Søk @@ -334,6 +405,7 @@ Bredde Ja Mappe + Søkeresultater Bakgrunnsfarge @@ -350,43 +422,43 @@ Kunne ikke lagre Web.Config-filen. Vennligst endre databasens tilkoblingsstreng manuelt. Din database er funnet og identifisert som Databasekonfigurasjon - Klikk <strong>installer</strong>-knappen for å installere Umbraco %0% databasen - Umbraco %0% har nå blitt kopiert til din database. Trykk <strong>Neste</strong> for å fortsette. - <p>Databasen ble ikke funnet! Vennligst sjekk at informasjonen i "connection string" i "web.config"-filen er korrekt.</p><p>For å fortsette, vennligst rediger "web.config"-filen (bruk Visual Studio eller din favoritteditor), rull ned til bunnen, og legg til tilkoblingsstrengen for din database i nøkkelen "umbracoDbDSN" og lagre filen.</p><p>Klikk <strong>prøv på nytt</strong> når du er ferdig.<br /> <a href="http://our.umbraco.org/documentation/Using-Umbraco/Config-files/webconfig7" target="_blank">Mer informasjon om redigering av web.config her.</a></p> - For å fullføre dette steget, må du vite en del informasjon om din database server ("tilkoblingsstreng").<br/> Vennligst kontakt din ISP om nødvendig. Hvis du installerer på en lokal maskin eller server, må du kanskje skaffe informasjonen fra din systemadministrator. - <p> Trykk på knappen <strong>oppgrader</strong> for å oppgradere databasen din til Umbraco %0%</p> <p> Ikke vær urolig - intet innhold vil bli slettet og alt vil fortsette å virke etterpå! </p> - Databasen din har blitt oppgradert til den siste utgaven, %0%.<br/>Trykk <strong>Neste</strong> for å fortsette. - Databasen din er av nyeste versjon! Klikk <strong>neste</strong> for å fortsette konfigurasjonsveiviseren - <strong>Passordet til standardbrukeren må endres! - <strong>Standardbrukeren har blitt deaktivert eller har ingen tilgang til Umbraco!</strong></p><p>Ingen videre handling er nødvendig. Klikk <b>neste</b> for å fortsette. - <strong>Passordet til standardbrukeren har blitt forandret etter installasjonen!</strong></p><p>Ingen videre handling er nødvendig. Klikk <strong>Neste</strong> for å fortsette. + installer-knappen for å installere Umbraco %0% databasen]]> + Neste for å fortsette.]]> + Databasen ble ikke funnet! Vennligst sjekk at informasjonen i "connection string" i "web.config"-filen er korrekt.

For å fortsette, vennligst rediger "web.config"-filen (bruk Visual Studio eller din favoritteditor), rull ned til bunnen, og legg til tilkoblingsstrengen for din database i nøkkelen "umbracoDbDSN" og lagre filen.

Klikk prøv på nytt når du er ferdig.
Mer informasjon om redigering av web.config her.

]]>
+ Vennligst kontakt din ISP om nødvendig. Hvis du installerer på en lokal maskin eller server, må du kanskje skaffe informasjonen fra din systemadministrator.]]> + Trykk på knappen oppgrader for å oppgradere databasen din til Umbraco %0%

Ikke vær urolig - intet innhold vil bli slettet og alt vil fortsette å virke etterpå!

]]>
+ Trykk Neste for å fortsette.]]> + neste for å fortsette konfigurasjonsveiviseren]]> + Passordet til standardbrukeren må endres!]]> + Standardbrukeren har blitt deaktivert eller har ingen tilgang til Umbraco!

Ingen videre handling er nødvendig. Klikk neste for å fortsette.]]> + Passordet til standardbrukeren har blitt forandret etter installasjonen!

Ingen videre handling er nødvendig. Klikk Neste for å fortsette.]]> Passordet er blitt endret! - <p> Umbraco skaper en standard bruker med login <strong> ( "admin") </ strong> og passord <strong> ( "default") </ strong>. Det er <strong> viktig </ strong> at passordet er endret til noe unikt. </ p> <p> Dette trinnet vil sjekke standard brukerens passord og foreslår hvis det må skiftes </ p> + Umbraco skaper en standard bruker med login ( "admin") og passord ( "default") . Det er viktig at passordet er endret til noe unikt.

Dette trinnet vil sjekke standard brukerens passord og foreslår hvis det må skiftes ]]> Få en god start med våre introduksjonsvideoer Ved å klikke på Neste-knappen (eller endre UmbracoConfigurationStatus i Web.config), godtar du lisensen for denne programvaren som angitt i boksen nedenfor. Legg merke til at denne Umbraco distribusjon består av to ulike lisenser, åpen kilde MIT lisens for rammen og Umbraco frivareverktøy lisens som dekker brukergrensesnittet. Ikke installert. Berørte filer og mapper Mer informasjon om å sette opp rettigheter for Umbraco her Du må gi ASP.NET brukeren rettigheter til å endre de følgende filer og mapper - <strong>Rettighetene er nesten perfekt satt opp!</strong><br/><br/> Du kan kjøre Umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte Umbraco fullt ut. + Rettighetene er nesten perfekt satt opp!

Du kan kjøre Umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte Umbraco fullt ut.]]> Hvordan løse problemet Klikk her for å lese tekstversjonen - Se vår <strong>innføringsvideo</strong> om å sette opp rettigheter for Umbraco eller les tekstversjonen. - <strong>Rettighetsinnstillingene kan være et problem!</strong><br/><br/> Du kan kjøre Umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte Umbraco fullt ut. - <strong>Rettighetsinstillingene er ikke klargjort for Umbraco!</strong><br/><br/> For å kunne kjøre Umbraco, må du oppdatere rettighetsinnstillingene dine. - <strong>Rettighetsinnstillingene er perfekt!</strong><br/><br/>Du er klar for å kjøre Umbraco og installere pakker! + innføringsvideo
om å sette opp rettigheter for Umbraco eller les tekstversjonen.]]> + Rettighetsinnstillingene kan være et problem!


Du kan kjøre Umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte Umbraco fullt ut.]]> + Rettighetsinstillingene er ikke klargjort for Umbraco!

For å kunne kjøre Umbraco, må du oppdatere rettighetsinnstillingene dine.]]>
+ Rettighetsinnstillingene er perfekt!

Du er klar for å kjøre Umbraco og installere pakker!]]>
Løser mappeproblem Følg denne linken for mer informasjon om problemer med ASP.NET og oppretting av mapper Konfigurerer mappetillatelser - Umbraco trenger skrive/endre tilgang til enkelte mapper for å kunne lagre filer som bilder og PDF-dokumenter. Den lagrer også midlertidig data (aka: hurtiglager) for å øke ytelsen på websiden din. + Jeg ønsker å starte fra bunnen. - Din website er helt tom for øyeblikket. Dette er perfekt hvis du vil begynne helt forfra og lage dine egne dokumenttyper og maler. (<a href="http://Umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">lær hvordan</a>) Du kan fortsatt velge å installere Runway senere. Vennligst gå til Utvikler-seksjonen og velg Pakker. + lær hvordan) Du kan fortsatt velge å installere Runway senere. Vennligst gå til Utvikler-seksjonen og velg Pakker.]]> Du har akkurat satt opp en ren Umbraco plattform. Hva vil du gjøre nå? Runway er installert - Du har nå fundamentet på plass. Velg hvilke moduler du ønsker å installer på toppen av det.<br/> Dette er vår liste av anbefalte moduler- Kryss av de du ønsker å installere, eller se den<a href="#" onclick="toggleModules(); return false;" id="toggleModuleList">fulle listen av moduler</a> + Dette er vår liste av anbefalte moduler- Kryss av de du ønsker å installere, eller se denfulle listen av moduler ]]> Bare anbefalt for erfarne brukere Jeg vil starte med en enkel webside - <p> "Runway" er en enkel webside som utstyrer deg med noen grunnleggende dokumenttyper og maler. Veiviseren kan sette opp Runway for deg automatisk, men du kan enkelt endre, utvide eller slette den. Runway er ikke nødvendig, og du kan enkelt bruke Umbraco uten den. Imidlertidig tilbyr Runway et enkelt fundament basert på de beste metodene for å hjelpe deg i gang fortere enn noensinne. Hvis du velger å installere Runway, kan du også velge blant grunnleggende byggeklosser kalt Runway Moduler for å forøke dine Runway-sider. </p> <small> <em>Sider inkludert i Runway:</em> Hjemmeside, Komme-i-gang, Installere moduler.<br /> <em>Valgfrie Moduler:</em> Toppnavigasjon, Sidekart, Kontakt, Galleri. </small> + "Runway" er en enkel webside som utstyrer deg med noen grunnleggende dokumenttyper og maler. Veiviseren kan sette opp Runway for deg automatisk, men du kan enkelt endre, utvide eller slette den. Runway er ikke nødvendig, og du kan enkelt bruke Umbraco uten den. Imidlertidig tilbyr Runway et enkelt fundament basert på de beste metodene for å hjelpe deg i gang fortere enn noensinne. Hvis du velger å installere Runway, kan du også velge blant grunnleggende byggeklosser kalt Runway Moduler for å forøke dine Runway-sider.

Sider inkludert i Runway: Hjemmeside, Komme-i-gang, Installere moduler.
Valgfrie Moduler: Toppnavigasjon, Sidekart, Kontakt, Galleri.
]]>
Hva er Runway Steg 1/5 Godta lisens Steg 2/5 Database konfigurasjon @@ -394,17 +466,17 @@ Steg 4/5: Skjekk Umbraco sikkerheten Steg 5/5: Umbraco er klar for deg til å starte! Tusen takk for at du valgte Umbraco! - <h3>Se ditt nye nettsted</h3> Du har installert Runway, hvorfor ikke se hvordan ditt nettsted ser ut. - <h3>Mer hjelp og info</h3> Få hjelp fra vårt prisbelønte samfunn, bla gjennom dokumentasjonen eller se noen gratis videoer på hvordan man bygger et enkelt nettsted, hvordan bruke pakker og en rask guide til Umbraco terminologi + Se ditt nye nettsted Du har installert Runway, hvorfor ikke se hvordan ditt nettsted ser ut.]]> + Mer hjelp og info Få hjelp fra vårt prisbelønte samfunn, bla gjennom dokumentasjonen eller se noen gratis videoer på hvordan man bygger et enkelt nettsted, hvordan bruke pakker og en rask guide til Umbraco terminologi]]> Umbraco %0% er installert og klar til bruk - For å fullføre installasjonen, må du manuelt endre <strong>web.config</strong> filen, og oppdatere AppSetting-nøkkelen <strong>UmbracoConfigurationStatus</strong> til verdien <strong>'%0%'</strong> - Du kan <strong>starte øyeblikkelig</strong> ved å klikke på "Start Umbraco" knappen nedenfor. <br/>Hvis du er <strong>ny på Umbraco</strong>, kan du finne mange ressurser på våre komme-i-gang sider. - <h3>Start Umbraco</h3> For å administrere din webside, åpne Umbraco og begynn å legge til innhold, oppdatere maler og stilark eller utvide funksjonaliteten + web.config filen, og oppdatere AppSetting-nøkkelen UmbracoConfigurationStatus til verdien '%0%']]> + starte øyeblikkelig ved å klikke på "Start Umbraco" knappen nedenfor.
Hvis du er ny på Umbraco, kan du finne mange ressurser på våre komme-i-gang sider.]]>
+ Start Umbraco For å administrere din webside, åpne Umbraco og begynn å legge til innhold, oppdatere maler og stilark eller utvide funksjonaliteten]]> Tilkobling til databasen mislyktes. Umbraco Versjon 3 Umbraco Versjon 4 - Pass på - Denne veiviseren vil hjelpe deg gjennom prosessen med å konfigurere <strong>Umbraco %0%</strong> for en ny installasjon eller oppgradering fra versjon 3.0. <br/><br/> Trykk <strong>"neste"</strong> for å starte veiviseren. + Se + Umbraco %0% for en ny installasjon eller oppgradering fra versjon 3.0.

Trykk "neste" for å starte veiviseren.]]>
Språkkode @@ -415,8 +487,16 @@ Forny innlogging for å lagre - <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">umbraco.org</a></p> - Velkommen til Umbraco, skriv inn ditt brukernavn og passord i feltene under: + Da er det søndag! + Smil, det er mandag! + Hurra, det er tirsdag! + For en herlig onsdag! + Gledelig torsdag! + Endelig fredag! + Gledelig lørdag + Logg på nedenfor + Din sesjon er utløpt + © 2001 - %0%
umbraco.com

]]>
Skrivebord @@ -433,63 +513,64 @@ Ingen node er valgt, vennligst velg en node i listen over før du klikker 'fortsett' Gjeldende nodes type tillates ikke under valgt node Gjeldende node kan ikke legges under en underordnet node + Denne noden kan ikke ligge på rotnivå Handlingen tillates ikke. Du mangler tilgang til en eller flere underordnede noder. Relater kopierte elementer til original(e) Rediger dine varsler for %0% - + - <p>Hei %0%</p> + ]]> + Hei %0%

- <p>Dette er en automatisk mail for å informere om at handlingen '%1%' - er blitt utført på siden <a href="http://%4%/actions/preview.aspx?id=%5%"><strong>'%2%'</strong></a> - av brukeren <strong>'%3%'</strong> - </p> - <div style="margin: 8px 0; padding: 8px; display: block;"> - <br /> - <a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/Umbraco/actions/editContent.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REDIGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp; - <br /> - </div> - <p> - <h3>Rettelser:</h3> - <table style="width: 100%;"> +

Dette er en automatisk mail for å informere om at handlingen '%1%' + er blitt utført på siden '%2%' + av brukeren '%3%' +

+ +

+

Rettelser:

+ %6% - </table> - </p> +
+

- <div style="margin: 8px 0; padding: 8px; display: block;"> - <br /> - <a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/Umbraco/actions/editContent.aspx?id=%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REDIGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp; - <br /> - </div> + - <p>Ha en fin dag!<br /><br /> +

Ha en fin dag!

Vennlig hilsen Umbraco roboten - </p> +

]]>
[%0%] Varsling om %1% utført på %2% - Varsling + Varslinger - Klikke browse og velg pakke fra lokal disk. Umbraco-pakker har vanligvis endelsen ".umb" eller ".zip". + Umbraco-pakker har vanligvis endelsen ".umb" eller ".zip".]]> Utvikler Demonstrasjon Dokumentasjon Metadata Pakkenavn Pakken inneholder ingen elementer - Denne pakkefilen inneholder ingen elementer å avinstallere.<br/><br/>Du kan trygt fjerne pakken fra systemet ved å klikke "avinstaller pakke" nedenfor. +
Du kan trygt fjerne pakken fra systemet ved å klikke "avinstaller pakke" nedenfor.]]>
Ingen oppdateringer tilgjengelig Alternativer for pakke Lesmeg for pakke @@ -498,12 +579,13 @@ Vennlig hilsen Umbraco roboten Pakken ble avinstallert Pakken ble vellykket avinstallert Avinstaller pakke - Du kan velge bort elementer du ikke vil slette på dette tidspunkt, nedenfor. Når du klikker "bekreft avinstallering" vil alle elementer som er krysset av bli slettet.<br/> <span style="color:red;font-weight:bold;">Advarsel:</span> alle dokumenter, media, etc. som som er avhengig av elementene du sletter, vil slutte å virke, noe som kan føre til ustabilitet, så avinstaller med forsiktighet. Hvis du er i tvil, kontakt pakkeutvikleren. + Advarsel: alle dokumenter, media, etc. som som er avhengig av elementene du sletter, vil slutte å virke, noe som kan føre til ustabilitet, så avinstaller med forsiktighet. Hvis du er i tvil, kontakt pakkeutvikleren.]]> Last ned oppdatering fra pakkeregisteret Oppgrader pakke Oppgraderingsinstrukser Det er en oppdatering tilgjengelig for denne pakken. Du kan laste den ned direkte fra pakkebrønnen. Pakkeversjon + Pakkeversjonshistorie Se pakkens nettsted @@ -514,8 +596,8 @@ Vennlig hilsen Umbraco roboten Avansert: Beskytt ved å velge hvilke brukergrupper som har tilgang til siden - Om du ønsker å kontrollere tilgang til siden ved å bruke rolle-basert autentisering,<br /> ved å bruke Umbraco's medlems-grupper - Du må opprette en medlemsgruppe før du kan bruke <br /> rollebasert autentikasjon. + ved å bruke Umbraco's medlems-grupper]]> + rollebasert autentikasjon.]]> Feilside Brukt når personer logger på, men ikke har tilgang Hvordan vil du beskytte siden din? @@ -531,32 +613,36 @@ Vennlig hilsen Umbraco roboten Om du ønsker å bruke enkel autentisering via ett enkelt brukernavn og passord + %0% kunne ikke publiseres fordi den har planlagt utgivelsesdato. + %0% ble ikke publisert. Ett eller flere felter ble ikke godkjent av validering. %0% kunne ikke publiseres fordi et tredjepartstillegg avbrøt handlingen. + %0% kan ikke publiseres fordi en overordnet side ikke er publisert. Inkluder upubliserte undersider Publiserer - vennligst vent... %0% av %1% sider har blitt publisert... %0% er nå publisert %0% og alle undersider er nå publisert Publiser alle undersider - Klikk <em>ok</em> for å publisere <strong>%0%</strong> og dermed gjøre innholdet synlig for alle.<br/><br />Du kan publisere denne siden og alle dens undersider ved å krysse av <em>Publiser alle undersider</em> nedenfor. - %0% ble ikke publisert. Ett eller flere felter ble ikke godkjent av validering. - %0% kan ikke publiseres fordi en overordnet side ikke er publisert. + ok for å publisere %0% og dermed gjøre innholdet synlig for alle.

Du kan publisere denne siden og alle dens undersider ved å krysse av Publiser alle undersider nedenfor.]]>
+ + + Du har ikke konfigurert noen godkjente farger - Legg til ekstern lenke - Legg til intern lenke - Legg til + skriv inn ekstern lenke + velg en intern side Tittel - Intern side - Url - Flytt ned - Flytt opp + Lenke Åpne i nytt vindu - Fjern lenke + Skriv inn en tekst + Skriv inn en lenke + + + Nullstill Gjeldende versjon - Dette viser forskjellene mellom den gjeldende og den valgte versjonen<br /><del>Rød</del> tekst vil ikke bli vist i den valgte versjonen. , <ins>grønn betyr lagt til</ins> + Rød tekst vil ikke bli vist i den valgte versjonen. , grønn betyr lagt til]]> Dokumentet er tilbakeført til en tidligere versjon Dette viser den valgte versjonen som HTML, bruk avviksvisningen hvis du ønsker å se forksjellene mellom to versjoner samtidig. Tilbakefør til @@ -579,6 +665,15 @@ Vennlig hilsen Umbraco roboten Statistikk Oversettelse Brukere + Hjelp + Skjemaer + Analytics + + + gå til + Hjelpeemner for + Videokapitler for + De beste Umbraco opplæringsvideoer Standardmal @@ -588,6 +683,7 @@ Vennlig hilsen Umbraco roboten Nodetype Type Stilark + Script Stilark-egenskap Arkfane Tittel på arkfane @@ -595,17 +691,24 @@ Vennlig hilsen Umbraco roboten Hovedinnholdstype aktivert Denne dokumenttypen bruker som hoveddokumenttype. Arkfaner fra hoveddokumenttyper vises ikke og kan kun endres på hoveddokumenttypen selv. + Ingen egenskaper definert i denne arkfanen. Klikk på "legg til ny egenskap" lenken i toppen for å opprette en ny egenskap. + Hovedinnholdstype + Opprett tilhørende mal Sortering ferdig. Dra elementene opp eller ned for å arrangere dem. Du kan også klikke kolonneoverskriftene for å sortere alt på en gang. - Vennligst vent. Elementene blir sortert, dette kan ta litt tid.<br/> <br/> Ikke lukk dette vinduet under sortering +
Ikke lukk dette vinduet under sortering]]>
+ En feil oppsto + Utilstrekkelige brukertillatelser, kunne ikke fullføre operasjonen + Avbrutt + Handlingen ble avbrutt av et tredjepartstillegg Publisering ble avbrutt av et tredjepartstillegg Egenskaptypen finnes allerede Egenskapstype opprettet - Navn: %0% <br /> DataType: %1% + DataType: %1%]]> Egenskapstype slettet Innholdstype lagret Du har opprettet en arkfane @@ -623,12 +726,15 @@ Vennlig hilsen Umbraco roboten Husk å publisere for å gjøre endringene synlig for besøkende Sendt for godkjenning Endringer har blitt sendt til godkjenning + Media lagret + Media lagret uten feil Medlem lagret Stilarksegenskap lagret Stilark lagret Mal lagret Feil ved lagring av bruker (sjekk loggen) Bruker lagret + Brukertypen lagret Filen ble ikke lagret Filen kunne ikke lagres. Vennligst sjekk filrettigheter Filen ble lagret @@ -647,13 +753,16 @@ Vennlig hilsen Umbraco roboten XSLT-koden ble ikke lagret, sjekk filrettigheter XSLT lagret Ingen feil i XSLT! - Media lagret - Brukertypen lagret Innhold avpublisert Delmal lagret Delmal lagret uten feil Delmal ble ikke lagret! En feil oppsto ved lagring av delmal + Script visning lagret + Script visning lagret uten feil! + Script visning ikke lagret + En feil oppsto under lagring av filen. + En feil oppsto under lagring av filen. Bruk CSS syntaks f.eks: h1, .redHeader, .blueText @@ -674,13 +783,41 @@ Vennlig hilsen Umbraco roboten Hurtigguide til Umbraco sine maltagger Mal + + Sett inn element + Velg ett oppsett for denne seksjonen + nedenfor og legg til det første elementet]]> + Klikk for å bygge inn + Klikk for å sette inn et bilde + Bildetekst... + Skriv her... + Rutenettoppsett + Et oppsett er det overordnede arbeidsområdet til ditt rutenett - du vil typisk kun behøve ét eller to + Legg til rutenettoppsett + Juster oppsettet ved at justere kolonnebredder og legg til ytterligere seksjoner + Radkonfigurasjoner + Rader er forhåndsdefinerte celler arrangert vannrett + Legg til radkonfigurasjon + Juster raden ved å sette celle bredder og legge til flere celler + Kolonner + Totale antallet kolonner i rutenettet + Innstillinger + Konfigurer hvilke innstillinger brukeren kan endre + Stiler + Konfigurer hvilke stiler redaktørene kan endre + Innstillingene lagres kun når json-konfigurasjonen er gyldig + Tillatt alle editorer + Tillat alle radkonfigurasjoner + Alternativt felt Alternativ tekst Store/små bokstaver + Encoding Felt som skal settes inn Konverter linjeskift - Erstatter et linjeskift med htmltaggen &lt;br&gt; + Erstatter et linjeskift med htmltaggen <br> + Egendefinerte felt Ja, kun dato Formatter som dato HTML koding @@ -693,19 +830,18 @@ Vennlig hilsen Umbraco roboten Sett inn før felt Rekursivt Fjern paragraftagger - Fjerner eventuelle &lt;P&gt; rundt teksten + Fjerner eventuelle <P> rundt teksten + Standardfelter Store bokstaver URL koding Dersom innholdet av feltene skal sendes til en URL skal spesialtegn formatteres Denne teksten vil benyttes dersom feltene over er tomme Dette feltet vil benyttes dersom feltet over er tomt Ja, med klokkeslett. Dato/tid separator: - Egendefinerte felt - Standardfelter Oppgaver satt til deg - Listen nedenfor viser oversettelsesoppgaver <strong>som du er tildelt</strong>. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML". <br/> For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen. + som du er tildelt. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML".
For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen.]]>
Lukk oppgave Oversettelses detaljer Last ned all oversettelsesoppgaver som XML @@ -713,7 +849,7 @@ Vennlig hilsen Umbraco roboten Last ned XML DTD Felt Inkluder undersider - + + ]]> [%0%] Oversettingsoppgave for %1% Ingen oversettelses-bruker funnet. Vennligst opprett en oversettelses-bruker før du begynner å sende innhold til oversetting Oppgaver opprettet av deg - Listen under viser sider <strong>opprettet av deg</strong>. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML". For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen. + opprettet av deg. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML". For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen.]]> Siden '%0%' har blitt sendt til oversetting Send til oversetting Tildelt av @@ -771,6 +907,7 @@ Vennlig hilsen Umbraco roboten Stiler Maler XSLT Filer + Analytics Ny oppdatering er klar @@ -782,6 +919,8 @@ Vennlig hilsen Umbraco roboten Administrator Kategorifelt Bytt passord + Nytt passord + Bekreft nytt passord Du kan endre passordet til Umbraco ved å fylle ut skjemaet under og klikke "Bytt passord" knappen. Innholdskanal Beskrivelsesfelt @@ -790,15 +929,18 @@ Vennlig hilsen Umbraco roboten Redaktør Utdragsfelt Språk - Login + Brukernavn Øverste nivå i Media Moduler Deaktiver tilgang til Umbraco Passord + Nullstill passord Passordet er endret Bekreft nytt passord Nytt passord Nytt passord kan ikke være blankt + Gjeldende passord + Feil passord Nytt og bekreftet passord må være like Nytt og bekreftet passord må være like Overskriv tillatelser på undernoder @@ -806,14 +948,15 @@ Vennlig hilsen Umbraco roboten Velg sider for å redigere deres tillatelser Søk i alle undersider Startnode - Brukernavn + Navn Brukertillatelser Brukertype Brukertyper Forfatter - Nytt passord - Bekreft nytt passord - Gjeldende passord - Feil passord + Oversetter + Endre + Din profil + Din historikk + Sesjonen utløper om
\ No newline at end of file From d5f9dfecc465d9d5e8d44f01d3e1dd94c4822840 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 8 Dec 2015 13:43:54 +0100 Subject: [PATCH 07/27] U4-7496 Backoffice dropdowns quit working in Chrome after update to v47.0.2526.73 #U4-7496 Fixed --- .../lib/angular/1.1.5/angular.js | 8 +- .../lib/angular/1.1.5/angular.min.js | 356 +++++++++--------- 2 files changed, 185 insertions(+), 179 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.js b/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.js index 145cadffcf..b5c3a5857d 100644 --- a/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.js +++ b/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.js @@ -16637,6 +16637,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { value = valueFn(scope, locals); } } + // Update the null option's selected property here so $render cleans it up correctly + if (optionGroupsCache[0].length > 1) { + if (optionGroupsCache[0][1].id !== key) { + optionGroupsCache[0][1].selected = false; + } + } } ctrl.$setViewValue(value); }); @@ -16758,7 +16764,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { lastElement.val(existingOption.id = option.id); } // lastElement.prop('selected') provided by jQuery has side-effects - if (lastElement[0].selected !== option.selected) { + if (existingOption.selected !== option.selected) { lastElement.prop('selected', (existingOption.selected = option.selected)); } } else { diff --git a/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.min.js b/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.min.js index 1ef70f5444..8110c74378 100644 --- a/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.min.js +++ b/src/Umbraco.Web.UI.Client/lib/angular/1.1.5/angular.min.js @@ -1,178 +1,178 @@ -/* - AngularJS v1.1.5 - (c) 2010-2012 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(M,T,p){'use strict';function lc(){var b=M.angular;M.angular=mc;return b}function Xa(b){return!b||typeof b.length!=="number"?!1:typeof b.hasOwnProperty!="function"&&typeof b.constructor!="function"?!0:b instanceof R||ga&&b instanceof ga||Ea.call(b)!=="[object Object]"||typeof b.callee==="function"}function n(b,a,c){var d;if(b)if(H(b))for(d in b)d!="prototype"&&d!="length"&&d!="name"&&b.hasOwnProperty(d)&&a.call(c,b[d],d);else if(b.forEach&&b.forEach!==n)b.forEach(a,c);else if(Xa(b))for(d= -0;d=0&&b.splice(c,1);return a}function V(b,a){if(sa(b)||b&&b.$evalAsync&&b.$watch)throw Error("Can't copy Window or Scope");if(a){if(b===a)throw Error("Can't copy equivalent objects or arrays");if(F(b))for(var c=a.length=0;c2?ka.call(arguments,2):[];return H(a)&&!(a instanceof RegExp)?c.length?function(){return arguments.length?a.apply(b,c.concat(ka.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}:a}function qc(b,a){var c=a;/^\$+/.test(b)?c=p:sa(a)?c="$WINDOW":a&&T===a?c="$DOCUMENT":a&&a.$evalAsync&& -a.$watch&&(c="$SCOPE");return c}function ha(b,a){return JSON.stringify(b,qc,a?" ":null)}function ub(b){return E(b)?JSON.parse(b):b}function ua(b){b&&b.length!==0?(b=I(""+b),b=!(b=="f"||b=="0"||b=="false"||b=="no"||b=="n"||b=="[]")):b=!1;return b}function va(b){b=w(b).clone();try{b.html("")}catch(a){}var c=w("
").append(b).html();try{return b[0].nodeType===3?I(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+I(b)})}catch(d){return I(c)}}function vb(b){var a={},c,d;n((b|| -"").split("&"),function(b){b&&(c=b.split("="),d=decodeURIComponent(c[0]),a[d]=B(c[1])?decodeURIComponent(c[1]):!0)});return a}function wb(b){var a=[];n(b,function(b,d){a.push(wa(d,!0)+(b===!0?"":"="+wa(b,!0)))});return a.length?a.join("&"):""}function ab(b){return wa(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function wa(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function rc(b, -a){function c(a){a&&d.push(a)}var d=[b],e,g,i=["ng:app","ng-app","x-ng-app","data-ng-app"],f=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;n(i,function(a){i[a]=!0;c(T.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(n(b.querySelectorAll("."+a),c),n(b.querySelectorAll("."+a+"\\:"),c),n(b.querySelectorAll("["+a+"]"),c))});n(d,function(a){if(!e){var b=f.exec(" "+a.className+" ");b?(e=a,g=(b[2]||"").replace(/\s+/g,",")):n(a.attributes,function(b){if(!e&&i[b.name])e=a,g=b.value})}});e&&a(e,g?[g]:[])} -function xb(b,a){var c=function(){b=w(b);a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");var c=yb(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animator",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)});e.enabled(!0)}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(M&&!d.test(M.name))return c();M.name=M.name.replace(d,"");Ha.resumeBootstrap=function(b){n(b,function(b){a.push(b)});c()}}function bb(b,a){a=a||"_";return b.replace(sc, -function(b,d){return(d?a:"")+b.toLowerCase()})}function cb(b,a,c){if(!b)throw Error("Argument '"+(a||"?")+"' is "+(c||"required"));return b}function xa(b,a,c){c&&F(b)&&(b=b[b.length-1]);cb(H(b),a,"not a function, got "+(b&&typeof b=="object"?b.constructor.name||"Object":typeof b));return b}function tc(b){function a(a,b,e){return a[b]||(a[b]=e())}return a(a(b,"angular",Object),"module",function(){var b={};return function(d,e,g){e&&b.hasOwnProperty(d)&&(b[d]=null);return a(b,d,function(){function a(c, -d,e){return function(){b[e||"push"]([c,d,arguments]);return m}}if(!e)throw Error("No module: "+d);var b=[],c=[],j=a("$injector","invoke"),m={_invokeQueue:b,_runBlocks:c,requires:e,name:d,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animationProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider", -"directive"),config:j,run:function(a){c.push(a);return this}};g&&j(g);return m})}})}function Ia(b){return b.replace(uc,function(a,b,d,e){return e?d.toUpperCase():d}).replace(vc,"Moz$1")}function db(b,a){function c(){var e;for(var b=[this],c=a,i,f,h,j,m,k;b.length;){i=b.shift();f=0;for(h=i.length;f 
"+b;a.removeChild(a.firstChild);eb(this,a.childNodes);this.remove()}else eb(this,b)}function fb(b){return b.cloneNode(!0)}function ya(b){zb(b);for(var a=0,b=b.childNodes||[];a-1}function Cb(b,a){a&&n(a.split(" "),function(a){b.className=U((" "+b.className+" ").replace(/[\n\t]/g," ").replace(" "+U(a)+" "," "))})}function Db(b,a){a&&n(a.split(" "),function(a){if(!La(b,a))b.className=U(b.className+" "+U(a))})}function eb(b,a){if(a)for(var a=!a.nodeName&&B(a.length)&&!sa(a)?a:[a],c=0;c 4096 bytes)!")}else{if(h.cookie!==D){D=h.cookie;d=D.split("; ");G={};for(f=0;f0&&(a=unescape(e.substring(0,j)),G[a]===p&&(G[a]=unescape(e.substring(j+1))))}return G}};f.defer=function(a,b){var c;o++;c=k(function(){delete u[c];e(a)},b||0);u[c]=!0;return c};f.defer.cancel=function(a){return u[a]?(delete u[a],l(a),e(q),!0):!1}}function Ec(){this.$get= -["$window","$log","$sniffer","$document",function(b,a,c,d){return new Dc(b,d,a,c)}]}function Fc(){this.$get=function(){function b(b,d){function e(a){if(a!=k){if(l){if(l==a)l=a.n}else l=a;g(a.n,a.p);g(a,k);k=a;k.n=null}}function g(a,b){if(a!=b){if(a)a.p=b;if(b)b.n=a}}if(b in a)throw Error("cacheId "+b+" taken");var i=0,f=t({},d,{id:b}),h={},j=d&&d.capacity||Number.MAX_VALUE,m={},k=null,l=null;return a[b]={put:function(a,b){var c=m[a]||(m[a]={key:a});e(c);if(!C(b))return a in h||i++,h[a]=b,i>j&&this.remove(l.key), -b},get:function(a){var b=m[a];if(b)return e(b),h[a]},remove:function(a){var b=m[a];if(b){if(b==k)k=b.p;if(b==l)l=b.n;g(b.n,b.p);delete m[a];delete h[a];i--}},removeAll:function(){h={};i=0;m={};k=l=null},destroy:function(){m=f=h=null;delete a[b]},info:function(){return t({},f,{size:i})}}}var a={};b.info=function(){var b={};n(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Gc(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function Jb(b){var a= -{},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,g="Template must have exactly one root element. was: ",i=/^\s*(https?|ftp|mailto|file):/;this.directive=function h(d,e){E(d)?(cb(e,"directive"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];n(a[d],function(a){try{var g=b.invoke(a);if(H(g))g={compile:S(g)};else if(!g.compile&&g.link)g.compile=S(g.link);g.priority=g.priority||0;g.name=g.name||d;g.require= -g.require||g.controller&&g.name;g.restrict=g.restrict||"A";e.push(g)}catch(h){c(h)}});return e}])),a[d].push(e)):n(d,rb(h));return this};this.urlSanitizationWhitelist=function(a){return B(a)?(i=a,this):i};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document",function(b,j,m,k,l,u,o,z,r){function y(a,b,c){a instanceof w||(a=w(a));n(a,function(b,c){b.nodeType==3&&b.nodeValue.match(/\S+/)&&(a[c]=w(b).wrap("").parent()[0])}); -var d=W(a,b,a,c);return function(b,c){cb(b,"scope");for(var e=c?Ba.clone.call(a):a,j=0,g=e.length;js.priority)break;if(t=s.scope)O("isolated scope",K,s,J),L(t)&&(x(J,"ng-isolate-scope"),K=s),x(J,"ng-scope"),r=r||s;A=s.name;if(t=s.controller)q=q||{},O("'"+A+"' controller",q[A],s,J),q[A]=s;if(t=s.transclude)O("transclusion",G,s,J),G=s,l=s.priority,t=="element"?(Y=w(b),J=c.$$element=w(T.createComment(" "+A+": "+c[A]+" ")),b=J[0],ja(e,w(Y[0]),b),P=y(Y,d,l)):(Y=w(fb(b)).contents(), -J.html(""),P=y(Y,d));if(s.template)if(O("template",W,s,J),W=s,t=H(s.template)?s.template(J,c):s.template,t=Lb(t),s.replace){Y=w("
"+U(t)+"
").contents();b=Y[0];if(Y.length!=1||b.nodeType!==1)throw Error(g+t);ja(e,J,b);A={$attr:{}};a=a.concat(v(b,a.splice(B+1,a.length-(B+1)),A));D(c,A);C=a.length}else J.html(t);if(s.templateUrl)O("template",W,s,J),W=s,k=$(a.splice(B,a.length-B),k,J,c,e,s.replace,P),C=a.length;else if(s.compile)try{na=s.compile(J,c,P),H(na)?h(null,na):na&&h(na.pre,na.post)}catch(I){m(I, -va(J))}if(s.terminal)k.terminal=!0,l=Math.max(l,s.priority)}k.scope=r&&r.scope;k.transclude=G&&P;return k}function G(d,e,j,g){var l=!1;if(a.hasOwnProperty(e))for(var k,e=b.get(e+c),i=0,o=e.length;ik.priority)&&k.restrict.indexOf(j)!=-1)d.push(k),l=!0}catch(u){m(u)}return l}function D(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;n(a,function(d,e){e.charAt(0)!="$"&&(b[e]&&(d+=(e==="style"?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});n(b,function(b,j){j=="class"?(x(e,b),a["class"]= -(a["class"]?a["class"]+" ":"")+b):j=="style"?e.attr("style",e.attr("style")+";"+b):j.charAt(0)!="$"&&!a.hasOwnProperty(j)&&(a[j]=b,d[j]=c[j])})}function $(a,b,c,d,e,j,h){var i=[],o,m,u=c[0],z=a.shift(),r=t({},z,{controller:null,templateUrl:null,transclude:null,scope:null}),z=H(z.templateUrl)?z.templateUrl(c,d):z.templateUrl;c.html("");k.get(z,{cache:l}).success(function(l){var k,z,l=Lb(l);if(j){z=w("
"+U(l)+"
").contents();k=z[0];if(z.length!=1||k.nodeType!==1)throw Error(g+l);l={$attr:{}}; -ja(e,c,k);v(k,a,l);D(d,l)}else k=u,c.html(l);a.unshift(r);o=A(a,k,d,h);for(m=W(c[0].childNodes,h);i.length;){var ea=i.shift(),l=i.shift();z=i.shift();var x=i.shift(),y=k;l!==u&&(y=fb(k),ja(z,w(l),y));o(function(){b(m,ea,y,e,x)},ea,y,e,x)}i=null}).error(function(a,b,c,d){throw Error("Failed to load template: "+d.url);});return function(a,c,d,e,j){i?(i.push(c),i.push(d),i.push(e),i.push(j)):o(function(){b(m,c,d,e,j)},c,d,e,j)}}function K(a,b){return b.priority-a.priority}function O(a,b,c,d){if(b)throw Error("Multiple directives ["+ -b.name+", "+c.name+"] asking for "+a+" on: "+va(d));}function P(a,b){var c=j(b,!0);c&&a.push({priority:0,compile:S(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c);x(d.data("$binding",e),"ng-binding");a.$watch(c,function(a){b[0].nodeValue=a})})})}function s(a,b,c,d){var e=j(c,!0);e&&b.push({priority:100,compile:S(function(a,b,c){b=c.$$observers||(c.$$observers={});if(e=j(c[d],!0))c[d]=e(a),(b[d]||(b[d]=[])).$$inter=!0,(c.$$observers&&c.$$observers[d].$$scope||a).$watch(e,function(a){c.$set(d, -a)})})})}function ja(a,b,c){var d=b[0],e=d.parentNode,j,g;if(a){j=0;for(g=a.length;j0){var e=O[0],f=e.text;if(f==a||f==b||f==c||f==d||!a&&!b&&!c&&!d)return e}return!1}function f(b, -c,d,f){return(b=i(b,c,d,f))?(a&&!b.json&&e("is not valid json",b),O.shift(),b):!1}function h(a){f(a)||e("is unexpected, expecting ["+a+"]",i())}function j(a,b){return t(function(c,d){return a(c,d,b)},{constant:b.constant})}function m(a,b,c){return t(function(d,e){return a(d,e)?b(d,e):c(d,e)},{constant:a.constant&&b.constant&&c.constant})}function k(a,b,c){return t(function(d,e){return b(d,e,a,c)},{constant:a.constant&&c.constant})}function l(){for(var a=[];;)if(O.length>0&&!i("}",")",";","]")&&a.push(w()), -!f(";"))return a.length==1?a[0]:function(b,c){for(var d,e=0;e","<=",">="))a=k(a,b.fn,x());return a}function n(){for(var a=v(),b;b=f("*","/","%");)a=k(a,b.fn,v());return a}function v(){var a;return f("+")?A():(a=f("-"))?k($,a.fn,v()):(a=f("!"))?j(a.fn,v()):A()}function A(){var a;if(f("("))a=w(),h(")");else if(f("["))a=G();else if(f("{"))a=D();else{var b=f();(a= -b.fn)||e("not a primary expression",b);if(b.json)a.constant=a.literal=!0}for(var c;b=f("(","[",".");)b.text==="("?(a=s(a,c),c=null):b.text==="["?(c=a,a=ma(a)):b.text==="."?(c=a,a=ja(a)):e("IMPOSSIBLE");return a}function G(){var a=[],b=!0;if(g().text!="]"){do{var c=P();a.push(c);c.constant||(b=!1)}while(f(","))}h("]");return t(function(b,c){for(var d=[],e=0;e1;d++){var e=a.shift(),g=b[e];g||(g={},b[e]=g);b=g}return b[a.shift()]=c}function ib(b,a,c){if(!a)return b;for(var a=a.split("."),d,e=b,g=a.length,i=0;ia)for(b in g++,e)e.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(x--,delete e[b])}else e!==f&&(e=f,g++);return g}, -function(){b(f,e,c)})},$digest:function(){var a,d,e,i,u=this.$$asyncQueue,o,z,r=b,n,x=[],p,v;g("$digest");do{z=!1;for(n=this;u.length;)try{n.$eval(u.shift())}catch(A){c(A)}do{if(i=n.$$watchers)for(o=i.length;o--;)try{if(a=i[o],(d=a.get(n))!==(e=a.last)&&!(a.eq?ia(d,e):typeof d=="number"&&typeof e=="number"&&isNaN(d)&&isNaN(e)))z=!0,a.last=a.eq?V(d):d,a.fn(d,e===f?d:e,n),r<5&&(p=4-r,x[p]||(x[p]=[]),v=H(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,v+="; newVal: "+ha(d)+"; oldVal: "+ha(e),x[p].push(v))}catch(G){c(G)}if(!(i= -n.$$childHead||n!==this&&n.$$nextSibling))for(;n!==this&&!(i=n.$$nextSibling);)n=n.$parent}while(n=i);if(z&&!r--)throw h.$$phase=null,Error(b+" $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: "+ha(x));}while(z||u.length);h.$$phase=null},$destroy:function(){if(!(h==this||this.$$destroyed)){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(a.$$childHead==this)a.$$childHead=this.$$nextSibling;if(a.$$childTail==this)a.$$childTail=this.$$prevSibling; -if(this.$$prevSibling)this.$$prevSibling.$$nextSibling=this.$$nextSibling;if(this.$$nextSibling)this.$$nextSibling.$$prevSibling=this.$$prevSibling;this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null}},$eval:function(a,b){return d(a)(this,b)},$evalAsync:function(a){this.$$asyncQueue.push(a)},$apply:function(a){try{return g("$apply"),this.$eval(a)}catch(b){c(b)}finally{h.$$phase=null;try{h.$digest()}catch(d){throw c(d),d;}}},$on:function(a,b){var c=this.$$listeners[a]; -c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[Ga(c,b)]=null}},$emit:function(a,b){var d=[],e,f=this,g=!1,i={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},h=[i].concat(ka.call(arguments,1)),n,x;do{e=f.$$listeners[a]||d;i.currentScope=f;n=0;for(x=e.length;n7),hasEvent:function(a){if(a=="input"&&Z==9)return!1;if(C(c[a])){var b= -e.createElement("div");c[a]="on"+a in b}return c[a]},csp:e.securityPolicy?e.securityPolicy.isActive:!1,vendorPrefix:g,transitions:h,animations:j}}]}function Zc(){this.$get=S(M)}function Wb(b){var a={},c,d,e;if(!b)return a;n(b.split("\n"),function(b){e=b.indexOf(":");c=I(U(b.substr(0,e)));d=U(b.substr(e+1));c&&(a[c]?a[c]+=", "+d:a[c]=d)});return a}function $c(b,a){var c=ad.exec(b);if(c==null)return!0;var d={protocol:c[2],host:c[4],port:N(c[6])||Oa[c[2]]||null,relativeProtocol:c[2]===p||c[2]===""}, -c=jb.exec(a),c={protocol:c[1],host:c[3],port:N(c[5])||Oa[c[1]]||null};return(d.protocol==c.protocol||d.relativeProtocol)&&d.host==c.host&&(d.port==c.port||d.relativeProtocol&&c.port==Oa[c.protocol])}function Xb(b){var a=L(b)?b:p;return function(c){a||(a=Wb(b));return c?a[I(c)]||null:a}}function Yb(b,a,c){if(H(c))return c(b,a);n(c,function(c){b=c(b,a)});return b}function bd(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults= -{transformResponse:[function(d){E(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=ub(d,!0)));return d}],transformRequest:[function(a){return L(a)&&Ea.apply(a)!=="[object File]"?ha(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:d,put:d,patch:d},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},g=this.interceptors=[],i=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,k,l){function u(a){function c(a){var b= -t({},a,{data:Yb(a.data,a.headers,d.transformResponse)});return 200<=a.status&&a.status<300?b:k.reject(b)}var d={transformRequest:e.transformRequest,transformResponse:e.transformResponse},f={};t(d,a);d.headers=f;d.method=oa(d.method);t(f,e.headers.common,e.headers[I(d.method)],a.headers);(a=$c(d.url,b.url())?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:p)&&(f[d.xsrfHeaderName||e.xsrfHeaderName]=a);var g=[function(a){var b=Yb(a.data,Xb(f),a.transformRequest);C(a.data)&&delete f["Content-Type"];if(C(a.withCredentials)&& -!C(e.withCredentials))a.withCredentials=e.withCredentials;return o(a,b,f).then(c,c)},p],j=k.when(d);for(n(y,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;)var a=g.shift(),i=g.shift(),j=j.then(a,i);j.success=function(a){j.then(function(b){a(b.data,b.status,b.headers,d)});return j};j.error=function(a){j.then(null,function(b){a(b.data,b.status,b.headers,d)});return j};return j}function o(b,c,g){function j(a, -b,c){n&&(200<=a&&a<300?n.put(s,[a,b,Wb(c)]):n.remove(s));i(b,a,c);d.$$phase||d.$apply()}function i(a,c,d){c=Math.max(c,0);(200<=c&&c<300?l.resolve:l.reject)({data:a,status:c,headers:Xb(d),config:b})}function h(){var a=Ga(u.pendingRequests,b);a!==-1&&u.pendingRequests.splice(a,1)}var l=k.defer(),o=l.promise,n,p,s=z(b.url,b.params);u.pendingRequests.push(b);o.then(h,h);if((b.cache||e.cache)&&b.cache!==!1&&b.method=="GET")n=L(b.cache)?b.cache:L(e.cache)?e.cache:r;if(n)if(p=n.get(s))if(p.then)return p.then(h, -h),p;else F(p)?i(p[1],p[0],V(p[2])):i(p,200,{});else n.put(s,o);p||a(b.method,s,c,j,g,b.timeout,b.withCredentials,b.responseType);return o}function z(a,b){if(!b)return a;var c=[];nc(b,function(a,b){a==null||a==p||(F(a)||(a=[a]),n(a,function(a){L(a)&&(a=ha(a));c.push(wa(b)+"="+wa(a))}))});return a+(a.indexOf("?")==-1?"?":"&")+c.join("&")}var r=c("$http"),y=[];n(g,function(a){y.unshift(E(a)?l.get(a):l.invoke(a))});n(i,function(a,b){var c=E(a)?l.get(a):l.invoke(a);y.splice(b,0,{response:function(a){return c(k.when(a))}, -responseError:function(a){return c(k.reject(a))}})});u.pendingRequests=[];(function(a){n(arguments,function(a){u[a]=function(b,c){return u(t(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){n(arguments,function(a){u[a]=function(b,c,d){return u(t(d||{},{method:a,url:b,data:c}))}})})("post","put");u.defaults=e;return u}]}function cd(){this.$get=["$browser","$window","$document",function(b,a,c){return dd(b,ed,b.defer,a.angular.callbacks,c[0],a.location.protocol.replace(":",""))}]} -function dd(b,a,c,d,e,g){function i(a,b){var c=e.createElement("script"),d=function(){e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;Z?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=d;e.body.appendChild(c);return d}return function(e,h,j,m,k,l,u,o){function z(){p=-1;t&&t();v&&v.abort()}function r(a,d,e,f){var j=(h.match(jb)||["",g])[1];A&&c.cancel(A);t=v=null;d=j=="file"?e?200:404:d;a(d==1223?204:d,e,f);b.$$completeOutstandingRequest(q)} -var p;b.$$incOutstandingRequestCount();h=h||b.url();if(I(e)=="jsonp"){var x="_"+(d.counter++).toString(36);d[x]=function(a){d[x].data=a};var t=i(h.replace("JSON_CALLBACK","angular.callbacks."+x),function(){d[x].data?r(m,200,d[x].data):r(m,p||-2);delete d[x]})}else{var v=new a;v.open(e,h,!0);n(k,function(a,b){a&&v.setRequestHeader(b,a)});v.onreadystatechange=function(){if(v.readyState==4){var a=v.getAllResponseHeaders(),b=["Cache-Control","Content-Language","Content-Type","Expires","Last-Modified", -"Pragma"];a||(a="",n(b,function(b){var c=v.getResponseHeader(b);c&&(a+=b+": "+c+"\n")}));r(m,p||v.status,v.responseType?v.response:v.responseText,a)}};if(u)v.withCredentials=!0;if(o)v.responseType=o;v.send(j||"")}if(l>0)var A=c(z,l);else l&&l.then&&l.then(z)}}function fd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4", -posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),SHORTMONTH:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),DAY:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),SHORTDAY:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y", -mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return b===1?"one":"other"}}}}function gd(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,f,h){var j=c.defer(),m=j.promise,k=B(h)&&!h,f=a.defer(function(){try{j.resolve(e())}catch(a){j.reject(a),d(a)}k||b.$apply()},f),h=function(){delete g[m.$$timeoutId]};m.$$timeoutId=f;g[f]=j;m.then(h,h);return m}var g={};e.cancel=function(b){return b&&b.$$timeoutId in -g?(g[b.$$timeoutId].reject("canceled"),a.defer.cancel(b.$$timeoutId)):!1};return e}]}function Zb(b){function a(a,e){return b.factory(a+c,e)}var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",$b);a("date",ac);a("filter",hd);a("json",id);a("limitTo",jd);a("lowercase",kd);a("number",bc);a("orderBy",cc);a("uppercase",ld)}function hd(){return function(b,a,c){if(!F(b))return b;var d=[];d.check=function(a){for(var b=0;b-1}}var e=function(a,b){if(typeof b=="string"&&b.charAt(0)==="!")return!e(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if(d.charAt(0)!=="$"&&e(a[d],b))return!0}return!1;case "array":for(d= -0;de+1?i="0":(f=i,j=!0)}if(!j){i=(i.split(ec)[1]||"").length;C(e)&&(e=Math.min(Math.max(a.minFrac,i), -a.maxFrac));var i=Math.pow(10,e),b=Math.round(b*i)/i,b=(""+b).split(ec),i=b[0],b=b[1]||"",j=0,m=a.lgSize,k=a.gSize;if(i.length>=m+k)for(var j=i.length-m,l=0;l0||e>-c)e+=c;e===0&&c==-12&&(e=12);return nb(e,a,d)}}function Qa(b,a){return function(c,d){var e=c["get"+b](),g=oa(a?"SHORT"+b:b);return d[g][e]}}function ac(b){function a(a){var b;if(b=a.match(c)){var a=new Date(0),g=0,i=0,f=b[8]?a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(g=N(b[9]+b[10]),i=N(b[9]+b[11]));f.call(a,N(b[1]),N(b[2])-1,N(b[3]));g=N(b[4]||0)-g;i=N(b[5]||0)-i;f= -N(b[6]||0);b=Math.round(parseFloat("0."+(b[7]||0))*1E3);h.call(a,g,i,f,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var g="",i=[],f,h,e=e||"mediumDate",e=b.DATETIME_FORMATS[e]||e;E(c)&&(c=md.test(c)?N(c):a(c));Ya(c)&&(c=new Date(c));if(!ra(c))return c;for(;e;)(h=nd.exec(e))?(i=i.concat(ka.call(h,1)),e=i.pop()):(i.push(e),e=null);n(i,function(a){f=od[a];g+=f?f(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g, -"").replace(/''/g,"'")});return g}}function id(){return function(b){return ha(b,!0)}}function jd(){return function(b,a){if(!F(b)&&!E(b))return b;a=N(a);if(E(b))return a?a>=0?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);a>0?(d=0,e=a):(d=b.length+a,e=b.length);for(;dl?(d.$setValidity("maxlength",!1),p):(d.$setValidity("maxlength",!0),a)};d.$parsers.push(e);d.$formatters.push(e)}}function ob(b,a){b="ngClass"+b;return aa(function(c,d,e){function g(b){if(a===!0||c.$index%2===a)h&&!ia(b,h)&&i(h),f(b);h=V(b)}function i(a){L(a)&&!F(a)&&(a=Za(a,function(a,b){if(a)return b}));d.removeClass(F(a)?a.join(" "):a)}function f(a){L(a)&&!F(a)&&(a=Za(a, -function(a,b){if(a)return b}));a&&d.addClass(F(a)?a.join(" "):a)}var h=p;c.$watch(e[b],g,!0);e.$observe("class",function(){var a=c.$eval(e[b]);g(a,a)});b!=="ngClass"&&c.$watch("$index",function(d,g){var h=d&1;h!==g&1&&(h===a?f(c.$eval(e[b])):i(c.$eval(e[b])))})})}var I=function(b){return E(b)?b.toLowerCase():b},oa=function(b){return E(b)?b.toUpperCase():b},Z=N((/msie (\d+)/.exec(I(navigator.userAgent))||[])[1]),w,ga,ka=[].slice,Wa=[].push,Ea=Object.prototype.toString,mc=M.angular,Ha=M.angular||(M.angular= -{}),Aa,hb,ba=["0","0","0"];q.$inject=[];qa.$inject=[];hb=Z<9?function(b){b=b.nodeName?b:b[0];return b.scopeName&&b.scopeName!="HTML"?oa(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var sc=/[A-Z]/g,pd={full:"1.1.5",major:1,minor:1,dot:5,codeName:"triangle-squarification"},Ka=R.cache={},Ja=R.expando="ng-"+(new Date).getTime(),wc=1,gc=M.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},gb= -M.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},uc=/([\:\-\_]+(.))/g,vc=/^moz([A-Z])/,Ba=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;T.readyState==="complete"?setTimeout(a):(this.bind("DOMContentLoaded",a),R(M).bind("load",a))},toString:function(){var b=[];n(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return b>=0?w(this[b]):w(this[this.length+b])},length:0,push:Wa,sort:[].sort, -splice:[].splice},Na={};n("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(b){Na[I(b)]=b});var Gb={};n("input,select,option,textarea,button,form,details".split(","),function(b){Gb[oa(b)]=!0});n({data:Bb,inheritedData:Ma,scope:function(b){return Ma(b,"$scope")},controller:Eb,injector:function(b){return Ma(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:La,css:function(b,a,c){a=Ia(a);if(B(c))b.style[a]=c;else{var d;Z<=8&&(d=b.currentStyle&&b.currentStyle[a], -d===""&&(d="auto"));d=d||b.style[a];Z<=8&&(d=d===""?p:d);return d}},attr:function(b,a,c){var d=I(a);if(Na[d])if(B(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||q).specified?d:p;else if(B(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),b===null?p:b},prop:function(b,a,c){if(B(c))b[a]=c;else return b[a]},text:t(Z<9?function(b,a){if(b.nodeType==1){if(C(a))return b.innerText;b.innerText=a}else{if(C(a))return b.nodeValue; -b.nodeValue=a}}:function(b,a){if(C(a))return b.textContent;b.textContent=a},{$dv:""}),val:function(b,a){if(C(a))return b.value;b.value=a},html:function(b,a){if(C(a))return b.innerHTML;for(var c=0,d=b.childNodes;c0||parseFloat(h[a+"Duration"])> -0)g="animation",i=a,j=Math.max(parseInt(h[g+"IterationCount"])||0,parseInt(h[i+"IterationCount"])||0,j);f=Math.max(x(h[g+"Delay"]),x(h[i+"Delay"]));g=Math.max(x(h[g+"Duration"]),x(h[i+"Duration"]));d=Math.max(f+j*g,d)}});e.setTimeout(v,d*1E3)}else v()}function v(){if(!v.run)v.run=!0,o(m,r,p),m.removeClass(w),m.removeClass(K),m.removeData(a)}var A=c.$eval(i.ngAnimate),w=A?L(A)?A[j]:A+"-"+j:"",D=d(w),A=D&&D.setup,$=D&&D.start,D=D&&D.cancel;if(w){var K=w+"-active";r||(r=p?p.parent():m.parent());if(!g.transitions&& -!A&&!$||(r.inheritedData(a)||q).running)k(m,r,p),o(m,r,p);else{var O=m.data(a)||{};O.running&&((D||q)(m),O.done());m.data(a,{running:!0,done:v});m.addClass(w);k(m,r,p);if(m.length==0)return v();var P=(A||q)(m);e.setTimeout(t,1)}}else k(m,r,p),o(m,r,p)}}function m(a,c,d){d?d.after(a):c.append(a)}var k={};k.enter=j("enter",m,q);k.leave=j("leave",q,function(a){a.remove()});k.move=j("move",function(a,c,d){m(a,c,d)},q);k.show=j("show",function(a){a.css("display","")},q);k.hide=j("hide",q,function(a){a.css("display", -"none")});k.animate=function(a,c){j(a,q,q)(c)};return k};i.enabled=function(a){if(arguments.length)c.running=!a;return!c.running};return i}]},Kb="Non-assignable model expression: ";Jb.$inject=["$provide"];var Ic=/^(x[\:\-_]|data[\:\-_])/i,jb=/^([^:]+):\/\/(\w+:{0,1}\w*@)?(\{?[\w\.-]*\}?)(:([0-9]+))?(\/[^\?#]*)?(\?([^#]*))?(#(.*))?$/,Pb=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,Oa={http:80,https:443,ftp:21};Rb.prototype=lb.prototype=Qb.prototype={$$replace:!1,absUrl:Pa("$$absUrl"),url:function(a,c){if(C(a))return this.$$url; -var d=Pb.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));if(d[2]||d[1])this.search(d[3]||"");this.hash(d[5]||"",c);return this},protocol:Pa("$$protocol"),host:Pa("$$host"),port:Pa("$$port"),path:Sb("$$path",function(a){return a.charAt(0)=="/"?a:"/"+a}),search:function(a,c){if(C(a))return this.$$search;B(c)?c===null?delete this.$$search[a]:this.$$search[a]=c:this.$$search=E(a)?vb(a):a;this.$$compose();return this},hash:Sb("$$hash",qa),replace:function(){this.$$replace=!0;return this}};var Da={"null":function(){return null}, -"true":function(){return!0},"false":function(){return!1},undefined:q,"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return B(d)?B(e)?d+e:d:B(e)?e:p},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(B(d)?d:0)-(B(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"^":function(a,c,d,e){return d(a,c)^e(a,c)},"=":q,"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a, -c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Qc={n:"\n",f:"\u000c",r:"\r", -t:"\t",v:"\u000b","'":"'",'"':'"'},mb={},ad=/^(([^:]+):)?\/\/(\w+:{0,1}\w*@)?([\w\.-]*)?(:([0-9]+))?(.*)$/,ed=M.XMLHttpRequest||function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");};Zb.$inject=["$provide"];$b.$inject=["$locale"];bc.$inject=["$locale"];var ec=".",od={yyyy:Q("FullYear",4),yy:Q("FullYear", -2,0,!0),y:Q("FullYear",1),MMMM:Qa("Month"),MMM:Qa("Month",!0),MM:Q("Month",2,1),M:Q("Month",1,1),dd:Q("Date",2),d:Q("Date",1),HH:Q("Hours",2),H:Q("Hours",1),hh:Q("Hours",2,-12),h:Q("Hours",1,-12),mm:Q("Minutes",2),m:Q("Minutes",1),ss:Q("Seconds",2),s:Q("Seconds",1),sss:Q("Milliseconds",3),EEEE:Qa("Day"),EEE:Qa("Day",!0),a:function(a,c){return a.getHours()<12?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){var a=-1*a.getTimezoneOffset(),c=a>=0?"+":"";c+=nb(Math[a>0?"floor":"ceil"](a/60),2)+nb(Math.abs(a%60), -2);return c}},nd=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,md=/^\d+$/;ac.$inject=["$locale"];var kd=S(I),ld=S(oa);cc.$inject=["$parse"];var rd=S({restrict:"E",compile:function(a,c){Z<=8&&(!c.href&&!c.name&&c.$set("href",""),a.append(T.createComment("IE fix")));return function(a,c){c.bind("click",function(a){c.attr("href")||a.preventDefault()})}}}),pb={};n(Na,function(a,c){var d=da("ng-"+c);pb[d]=function(){return{priority:100,compile:function(){return function(a, -g,i){a.$watch(i[d],function(a){i.$set(c,!!a)})}}}}});n(["src","srcset","href"],function(a){var c=da("ng-"+a);pb[c]=function(){return{priority:99,link:function(d,e,g){g.$observe(c,function(c){c&&(g.$set(a,c),Z&&e.prop(a,g[a]))})}}}});var Ta={$addControl:q,$removeControl:q,$setValidity:q,$setDirty:q,$setPristine:q};fc.$inject=["$element","$attrs","$scope"];var Wa=function(a){return["$timeout",function(c){var d={name:"form",restrict:"E",controller:fc,compile:function(){return{pre:function(a,d,i,f){if(!i.action){var h= -function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};gc(d[0],"submit",h);d.bind("$destroy",function(){c(function(){gb(d[0],"submit",h)},0,!1)})}var j=d.parent().controller("form"),m=i.name||i.ngForm;m&&(a[m]=f);j&&d.bind("$destroy",function(){j.$removeControl(f);m&&(a[m]=p);t(f,Ta)})}}}};return a?t(V(d),{restrict:"EAC"}):d}]},sd=Wa(),td=Wa(!0),ud=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,vd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/, -wd=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,hc={text:Va,number:function(a,c,d,e,g,i){Va(a,c,d,e,g,i);e.$parsers.push(function(a){var c=X(a);return c||wd.test(a)?(e.$setValidity("number",!0),a===""?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),p)});e.$formatters.push(function(a){return X(a)?"":""+a});if(d.min){var f=parseFloat(d.min),a=function(a){return!X(a)&&ah?(e.$setValidity("max",!1),p):(e.$setValidity("max",!0),a)};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){return X(a)||Ya(a)?(e.$setValidity("number",!0),a):(e.$setValidity("number",!1),p)})},url:function(a,c,d,e,g,i){Va(a,c,d,e,g,i);a=function(a){return X(a)||ud.test(a)?(e.$setValidity("url",!0),a):(e.$setValidity("url",!1),p)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,g,i){Va(a,c,d,e,g,i);a=function(a){return X(a)||vd.test(a)? -(e.$setValidity("email",!0),a):(e.$setValidity("email",!1),p)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){C(d.name)&&c.attr("name",Fa());c.bind("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,i=d.ngFalseValue;E(g)||(g=!0);E(i)||(i=!1);c.bind("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})}); -e.$render=function(){c[0].checked=e.$viewValue};e.$formatters.push(function(a){return a===g});e.$parsers.push(function(a){return a?g:i})},hidden:q,button:q,submit:q,reset:q},ic=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,g,i){i&&(hc[I(g.type)]||hc.text)(d,e,g,i,c,a)}}}],Sa="ng-valid",Ra="ng-invalid",pa="ng-pristine",Ua="ng-dirty",xd=["$scope","$exceptionHandler","$attrs","$element","$parse",function(a,c,d,e,g){function i(a,c){c=c?"-"+bb(c,"-"):""; -e.removeClass((a?Ra:Sa)+c).addClass((a?Sa:Ra)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var f=g(d.ngModel),h=f.assign;if(!h)throw Error(Kb+d.ngModel+" ("+va(e)+")");this.$render=q;var j=e.inheritedData("$formController")||Ta,m=0,k=this.$error={};e.addClass(pa);i(!0);this.$setValidity=function(a,c){if(k[a]!==!c){if(c){if(k[a]&&m--,!m)i(!0),this.$valid= -!0,this.$invalid=!1}else i(!1),this.$invalid=!0,this.$valid=!1,m++;k[a]=!c;i(c,a);j.$setValidity(a,c,this)}};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;e.removeClass(Ua).addClass(pa)};this.$setViewValue=function(d){this.$viewValue=d;if(this.$pristine)this.$dirty=!0,this.$pristine=!1,e.removeClass(pa).addClass(Ua),j.$setDirty();n(this.$parsers,function(a){d=a(d)});if(this.$modelValue!==d)this.$modelValue=d,h(a,d),n(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})}; -var l=this;a.$watch(function(){var c=f(a);if(l.$modelValue!==c){var d=l.$formatters,e=d.length;for(l.$modelValue=c;e--;)c=d[e](c);if(l.$viewValue!==c)l.$viewValue=c,l.$render()}})}],yd=function(){return{require:["ngModel","^?form"],controller:xd,link:function(a,c,d,e){var g=e[0],i=e[1]||Ta;i.$addControl(g);c.bind("$destroy",function(){i.$removeControl(g)})}}},zd=S({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),jc=function(){return{require:"?ngModel", -link:function(a,c,d,e){if(e){d.required=!0;var g=function(a){if(d.required&&(X(a)||a===!1))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(g);e.$parsers.unshift(g);d.$observe("required",function(){g(e.$viewValue)})}}}},Ad=function(){return{require:"ngModel",link:function(a,c,d,e){var g=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){var c=[];a&&n(a.split(g),function(a){a&&c.push(U(a))});return c});e.$formatters.push(function(a){return F(a)? -a.join(", "):p})}}},Bd=/^(true|false|\d+)$/,Cd=function(){return{priority:100,compile:function(a,c){return Bd.test(c.ngValue)?function(a,c,g){g.$set("value",a.$eval(g.ngValue))}:function(a,c,g){a.$watch(g.ngValue,function(a){g.$set("value",a,!1)})}}}},Dd=aa(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==p?"":a)})}),Ed=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding", -c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],Fd=[function(){return function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBindHtmlUnsafe);a.$watch(d.ngBindHtmlUnsafe,function(a){c.html(a||"")})}}],Gd=ob("",!0),Hd=ob("Odd",0),Id=ob("Even",1),Jd=aa({compile:function(a,c){c.$set("ngCloak",p);a.removeClass("ng-cloak")}}),Kd=[function(){return{scope:!0,controller:"@"}}],Ld=["$sniffer",function(a){return{priority:1E3,compile:function(){a.csp=!0}}}],kc={};n("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress".split(" "), -function(a){var c=da("ng-"+a);kc[c]=["$parse",function(d){return function(e,g,i){var f=d(i[c]);g.bind(I(a),function(a){e.$apply(function(){f(e,{$event:a})})})}}]});var Md=aa(function(a,c,d){c.bind("submit",function(){a.$apply(d.ngSubmit)})}),Nd=["$animator",function(a){return{transclude:"element",priority:1E3,terminal:!0,restrict:"A",compile:function(c,d,e){return function(c,d,f){var h=a(c,f),j,m;c.$watch(f.ngIf,function(a){j&&(h.leave(j),j=p);m&&(m.$destroy(),m=p);ua(a)&&(m=c.$new(),e(m,function(a){j= -a;h.enter(a,d.parent(),d)}))})}}}}],Od=["$http","$templateCache","$anchorScroll","$compile","$animator",function(a,c,d,e,g){return{restrict:"ECA",terminal:!0,compile:function(i,f){var h=f.ngInclude||f.src,j=f.onload||"",m=f.autoscroll;return function(f,i,n){var o=g(f,n),p=0,r,t=function(){r&&(r.$destroy(),r=null);o.leave(i.contents(),i)};f.$watch(h,function(g){var h=++p;g?(a.get(g,{cache:c}).success(function(a){h===p&&(r&&r.$destroy(),r=f.$new(),o.leave(i.contents(),i),a=w("
").html(a).contents(), -o.enter(a,i),e(a)(r),B(m)&&(!m||f.$eval(m))&&d(),r.$emit("$includeContentLoaded"),f.$eval(j))}).error(function(){h===p&&t()}),f.$emit("$includeContentRequested")):t()})}}}}],Pd=aa({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Qd=aa({terminal:!0,priority:1E3}),Rd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,g,i){var f=i.count,h=g.attr(i.$attr.when),j=i.offset||0,m=e.$eval(h),k={},l=c.startSymbol(),p=c.endSymbol();n(m,function(a,e){k[e]= -c(a.replace(d,l+f+"-"+j+p))});e.$watch(function(){var c=parseFloat(e.$eval(f));return isNaN(c)?"":(c in m||(c=a.pluralCat(c-j)),k[c](e,g,!0))},function(a){g.text(a)})}}}],Sd=["$parse","$animator",function(a,c){return{transclude:"element",priority:1E3,terminal:!0,compile:function(d,e,g){return function(d,e,h){var j=c(d,h),m=h.ngRepeat,k=m.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),l,p,o,z,r,t={$id:la};if(!k)throw Error("Expected ngRepeat in form of '_item_ in _collection_[ track by _id_]' but got '"+ -m+"'.");h=k[1];o=k[2];(k=k[4])?(l=a(k),p=function(a,c,e){r&&(t[r]=a);t[z]=c;t.$index=e;return l(d,t)}):p=function(a,c){return la(c)};k=h.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!k)throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '"+h+"'.");z=k[3]||k[1];r=k[2];var x={};d.$watchCollection(o,function(a){var c,h,k=e,l,o={},t,q,w,s,B,y,C=[];if(Xa(a))B=a;else{B=[];for(w in a)a.hasOwnProperty(w)&&w.charAt(0)!="$"&&B.push(w);B.sort()}t=B.length;h= -C.length=B.length;for(c=0;c
").html(k).contents();o.enter(k,c);var k=g(k),m=d.current;l=m.scope=a.$new();if(m.controller)f.$scope= -l,f=i(m.controller,f),m.controllerAs&&(l[m.controllerAs]=f),c.children().data("$ngControllerController",f);k(l);l.$emit("$viewContentLoaded");l.$eval(n);e()}else o.leave(c.contents(),c),l&&(l.$destroy(),l=null)}var l,n=m.onload||"",o=f(a,m);a.$on("$routeChangeSuccess",k);k()}}}],ae=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){d.type=="text/ng-template"&&a.put(d.id,c[0].text)}}}],be=S({terminal:!0}),ce=["$compile","$parse",function(a,c){var d=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/, -e={$setViewValue:q};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var h=this,j={},m=e,k;h.databound=d.ngModel;h.init=function(a,c,d){m=a;k=d};h.addOption=function(c){j[c]=!0;m.$viewValue==c&&(a.val(c),k.parent()&&k.remove())};h.removeOption=function(a){this.hasOption(a)&&(delete j[a],m.$viewValue==a&&this.renderUnknownOption(a))};h.renderUnknownOption=function(c){c="? "+la(c)+" ?";k.val(c);a.prepend(k);a.val(c);k.prop("selected",!0)};h.hasOption= -function(a){return j.hasOwnProperty(a)};c.$on("$destroy",function(){h.renderUnknownOption=q})}],link:function(e,i,f,h){function j(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(v.parent()&&v.remove(),c.val(a),a===""&&t.prop("selected",!0)):C(a)&&t?c.val(""):e.renderUnknownOption(a)};c.bind("change",function(){a.$apply(function(){v.parent()&&v.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new za(d.$viewValue);n(c.find("option"),function(c){c.selected= -B(a.get(c.value))})};a.$watch(function(){ia(e,d.$viewValue)||(e=V(d.$viewValue),d.$render())});c.bind("change",function(){a.$apply(function(){var a=[];n(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function k(e,f,g){function i(){var a={"":[]},c=[""],d,h,q,v,s;q=g.$modelValue;v=u(e)||[];var z=l?qb(v):v,B,y,A;y={};s=!1;var C,D;if(o)if(t&&F(q)){s=new za([]);for(h=0;hA;)v.pop().element.remove()}for(;w.length>y;)w.pop()[0].element.remove()} -var h;if(!(h=q.match(d)))throw Error("Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_ (track by _expr_)?' but got '"+q+"'.");var j=c(h[2]||h[1]),k=h[4]||h[6],l=h[5],m=c(h[3]||""),n=c(h[2]?h[1]:k),u=c(h[7]),t=h[8]?c(h[8]):null,w=[[{element:f,label:""}]];r&&(a(r)(e),r.removeClass("ng-scope"),r.remove());f.html("");f.bind("change",function(){e.$apply(function(){var a,c=u(e)||[],d={},h,i,j,m,q,r;if(o){i=[];m=0;for(r=w.length;m@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none;}ng\\:form{display:block;}'); +/* + AngularJS v1.1.5 + (c) 2010-2012 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(M,T,p){'use strict';function lc(){var b=M.angular;M.angular=mc;return b}function Xa(b){return!b||typeof b.length!=="number"?!1:typeof b.hasOwnProperty!="function"&&typeof b.constructor!="function"?!0:b instanceof R||ga&&b instanceof ga||Ea.call(b)!=="[object Object]"||typeof b.callee==="function"}function n(b,a,c){var d;if(b)if(H(b))for(d in b)d!="prototype"&&d!="length"&&d!="name"&&b.hasOwnProperty(d)&&a.call(c,b[d],d);else if(b.forEach&&b.forEach!==n)b.forEach(a,c);else if(Xa(b))for(d= +0;d=0&&b.splice(c,1);return a}function V(b,a){if(sa(b)||b&&b.$evalAsync&&b.$watch)throw Error("Can't copy Window or Scope");if(a){if(b===a)throw Error("Can't copy equivalent objects or arrays");if(F(b))for(var c=a.length=0;c2?ka.call(arguments,2):[];return H(a)&&!(a instanceof RegExp)?c.length?function(){return arguments.length?a.apply(b,c.concat(ka.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}:a}function qc(b,a){var c=a;/^\$+/.test(b)?c=p:sa(a)?c="$WINDOW":a&&T===a?c="$DOCUMENT":a&&a.$evalAsync&& +a.$watch&&(c="$SCOPE");return c}function ha(b,a){return JSON.stringify(b,qc,a?" ":null)}function ub(b){return E(b)?JSON.parse(b):b}function ua(b){b&&b.length!==0?(b=I(""+b),b=!(b=="f"||b=="0"||b=="false"||b=="no"||b=="n"||b=="[]")):b=!1;return b}function va(b){b=v(b).clone();try{b.html("")}catch(a){}var c=v("
").append(b).html();try{return b[0].nodeType===3?I(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+I(b)})}catch(d){return I(c)}}function vb(b){var a={},c,d;n((b|| +"").split("&"),function(b){b&&(c=b.split("="),d=decodeURIComponent(c[0]),a[d]=B(c[1])?decodeURIComponent(c[1]):!0)});return a}function wb(b){var a=[];n(b,function(b,d){a.push(wa(d,!0)+(b===!0?"":"="+wa(b,!0)))});return a.length?a.join("&"):""}function ab(b){return wa(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function wa(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function rc(b, +a){function c(a){a&&d.push(a)}var d=[b],e,g,i=["ng:app","ng-app","x-ng-app","data-ng-app"],f=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;n(i,function(a){i[a]=!0;c(T.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(n(b.querySelectorAll("."+a),c),n(b.querySelectorAll("."+a+"\\:"),c),n(b.querySelectorAll("["+a+"]"),c))});n(d,function(a){if(!e){var b=f.exec(" "+a.className+" ");b?(e=a,g=(b[2]||"").replace(/\s+/g,",")):n(a.attributes,function(b){if(!e&&i[b.name])e=a,g=b.value})}});e&&a(e,g?[g]:[])} +function xb(b,a){var c=function(){b=v(b);a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");var c=yb(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animator",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)});e.enabled(!0)}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(M&&!d.test(M.name))return c();M.name=M.name.replace(d,"");Ha.resumeBootstrap=function(b){n(b,function(b){a.push(b)});c()}}function bb(b,a){a=a||"_";return b.replace(sc, +function(b,d){return(d?a:"")+b.toLowerCase()})}function cb(b,a,c){if(!b)throw Error("Argument '"+(a||"?")+"' is "+(c||"required"));return b}function xa(b,a,c){c&&F(b)&&(b=b[b.length-1]);cb(H(b),a,"not a function, got "+(b&&typeof b=="object"?b.constructor.name||"Object":typeof b));return b}function tc(b){function a(a,b,e){return a[b]||(a[b]=e())}return a(a(b,"angular",Object),"module",function(){var b={};return function(d,e,g){e&&b.hasOwnProperty(d)&&(b[d]=null);return a(b,d,function(){function a(c, +d,e){return function(){b[e||"push"]([c,d,arguments]);return m}}if(!e)throw Error("No module: "+d);var b=[],c=[],j=a("$injector","invoke"),m={_invokeQueue:b,_runBlocks:c,requires:e,name:d,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animationProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider", +"directive"),config:j,run:function(a){c.push(a);return this}};g&&j(g);return m})}})}function Ia(b){return b.replace(uc,function(a,b,d,e){return e?d.toUpperCase():d}).replace(vc,"Moz$1")}function db(b,a){function c(){var e;for(var b=[this],c=a,i,f,h,j,m,k;b.length;){i=b.shift();f=0;for(h=i.length;f 
"+b;a.removeChild(a.firstChild);eb(this,a.childNodes);this.remove()}else eb(this,b)}function fb(b){return b.cloneNode(!0)}function ya(b){zb(b);for(var a=0,b=b.childNodes||[];a-1}function Cb(b,a){a&&n(a.split(" "),function(a){b.className=U((" "+b.className+" ").replace(/[\n\t]/g," ").replace(" "+U(a)+" "," "))})}function Db(b,a){a&&n(a.split(" "),function(a){if(!La(b,a))b.className=U(b.className+" "+U(a))})}function eb(b,a){if(a)for(var a=!a.nodeName&&B(a.length)&&!sa(a)?a:[a],c=0;c 4096 bytes)!")}else{if(h.cookie!==D){D=h.cookie;d=D.split("; ");G={};for(f=0;f0&&(a=unescape(e.substring(0,j)),G[a]===p&&(G[a]=unescape(e.substring(j+1))))}return G}};f.defer=function(a,b){var c;o++;c=k(function(){delete u[c];e(a)},b||0);u[c]=!0;return c};f.defer.cancel=function(a){return u[a]?(delete u[a],l(a),e(q),!0):!1}}function Ec(){this.$get= +["$window","$log","$sniffer","$document",function(b,a,c,d){return new Dc(b,d,a,c)}]}function Fc(){this.$get=function(){function b(b,d){function e(a){if(a!=k){if(l){if(l==a)l=a.n}else l=a;g(a.n,a.p);g(a,k);k=a;k.n=null}}function g(a,b){if(a!=b){if(a)a.p=b;if(b)b.n=a}}if(b in a)throw Error("cacheId "+b+" taken");var i=0,f=t({},d,{id:b}),h={},j=d&&d.capacity||Number.MAX_VALUE,m={},k=null,l=null;return a[b]={put:function(a,b){var c=m[a]||(m[a]={key:a});e(c);if(!C(b))return a in h||i++,h[a]=b,i>j&&this.remove(l.key), +b},get:function(a){var b=m[a];if(b)return e(b),h[a]},remove:function(a){var b=m[a];if(b){if(b==k)k=b.p;if(b==l)l=b.n;g(b.n,b.p);delete m[a];delete h[a];i--}},removeAll:function(){h={};i=0;m={};k=l=null},destroy:function(){m=f=h=null;delete a[b]},info:function(){return t({},f,{size:i})}}}var a={};b.info=function(){var b={};n(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Gc(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function Jb(b){var a= +{},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,g="Template must have exactly one root element. was: ",i=/^\s*(https?|ftp|mailto|file):/;this.directive=function h(d,e){E(d)?(cb(e,"directive"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];n(a[d],function(a){try{var g=b.invoke(a);if(H(g))g={compile:S(g)};else if(!g.compile&&g.link)g.compile=S(g.link);g.priority=g.priority||0;g.name=g.name||d;g.require= +g.require||g.controller&&g.name;g.restrict=g.restrict||"A";e.push(g)}catch(h){c(h)}});return e}])),a[d].push(e)):n(d,rb(h));return this};this.urlSanitizationWhitelist=function(a){return B(a)?(i=a,this):i};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document",function(b,j,m,k,l,u,o,z,r){function y(a,b,c){a instanceof v||(a=v(a));n(a,function(b,c){b.nodeType==3&&b.nodeValue.match(/\S+/)&&(a[c]=v(b).wrap("").parent()[0])}); +var d=W(a,b,a,c);return function(b,c){cb(b,"scope");for(var e=c?Ba.clone.call(a):a,j=0,g=e.length;js.priority)break;if(t=s.scope)O("isolated scope",K,s,J),L(t)&&(x(J,"ng-isolate-scope"),K=s),x(J,"ng-scope"),r=r||s;A=s.name;if(t=s.controller)q=q||{},O("'"+A+"' controller",q[A],s,J),q[A]=s;if(t=s.transclude)O("transclusion",G,s,J),G=s,l=s.priority,t=="element"?(Y=v(b),J=c.$$element=v(T.createComment(" "+A+": "+c[A]+" ")),b=J[0],ja(e,v(Y[0]),b),P=y(Y,d,l)):(Y=v(fb(b)).contents(), +J.html(""),P=y(Y,d));if(s.template)if(O("template",W,s,J),W=s,t=H(s.template)?s.template(J,c):s.template,t=Lb(t),s.replace){Y=v("
"+U(t)+"
").contents();b=Y[0];if(Y.length!=1||b.nodeType!==1)throw Error(g+t);ja(e,J,b);A={$attr:{}};a=a.concat(w(b,a.splice(B+1,a.length-(B+1)),A));D(c,A);C=a.length}else J.html(t);if(s.templateUrl)O("template",W,s,J),W=s,k=$(a.splice(B,a.length-B),k,J,c,e,s.replace,P),C=a.length;else if(s.compile)try{na=s.compile(J,c,P),H(na)?h(null,na):na&&h(na.pre,na.post)}catch(I){m(I, +va(J))}if(s.terminal)k.terminal=!0,l=Math.max(l,s.priority)}k.scope=r&&r.scope;k.transclude=G&&P;return k}function G(d,e,j,g){var l=!1;if(a.hasOwnProperty(e))for(var k,e=b.get(e+c),i=0,o=e.length;ik.priority)&&k.restrict.indexOf(j)!=-1)d.push(k),l=!0}catch(u){m(u)}return l}function D(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;n(a,function(d,e){e.charAt(0)!="$"&&(b[e]&&(d+=(e==="style"?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});n(b,function(b,j){j=="class"?(x(e,b),a["class"]= +(a["class"]?a["class"]+" ":"")+b):j=="style"?e.attr("style",e.attr("style")+";"+b):j.charAt(0)!="$"&&!a.hasOwnProperty(j)&&(a[j]=b,d[j]=c[j])})}function $(a,b,c,d,e,j,h){var i=[],o,m,u=c[0],z=a.shift(),r=t({},z,{controller:null,templateUrl:null,transclude:null,scope:null}),z=H(z.templateUrl)?z.templateUrl(c,d):z.templateUrl;c.html("");k.get(z,{cache:l}).success(function(l){var k,z,l=Lb(l);if(j){z=v("
"+U(l)+"
").contents();k=z[0];if(z.length!=1||k.nodeType!==1)throw Error(g+l);l={$attr:{}}; +ja(e,c,k);w(k,a,l);D(d,l)}else k=u,c.html(l);a.unshift(r);o=A(a,k,d,h);for(m=W(c[0].childNodes,h);i.length;){var ea=i.shift(),l=i.shift();z=i.shift();var x=i.shift(),y=k;l!==u&&(y=fb(k),ja(z,v(l),y));o(function(){b(m,ea,y,e,x)},ea,y,e,x)}i=null}).error(function(a,b,c,d){throw Error("Failed to load template: "+d.url);});return function(a,c,d,e,j){i?(i.push(c),i.push(d),i.push(e),i.push(j)):o(function(){b(m,c,d,e,j)},c,d,e,j)}}function K(a,b){return b.priority-a.priority}function O(a,b,c,d){if(b)throw Error("Multiple directives ["+ +b.name+", "+c.name+"] asking for "+a+" on: "+va(d));}function P(a,b){var c=j(b,!0);c&&a.push({priority:0,compile:S(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c);x(d.data("$binding",e),"ng-binding");a.$watch(c,function(a){b[0].nodeValue=a})})})}function s(a,b,c,d){var e=j(c,!0);e&&b.push({priority:100,compile:S(function(a,b,c){b=c.$$observers||(c.$$observers={});if(e=j(c[d],!0))c[d]=e(a),(b[d]||(b[d]=[])).$$inter=!0,(c.$$observers&&c.$$observers[d].$$scope||a).$watch(e,function(a){c.$set(d, +a)})})})}function ja(a,b,c){var d=b[0],e=d.parentNode,j,g;if(a){j=0;for(g=a.length;j0){var e=O[0],f=e.text;if(f==a||f==b||f==c||f==d||!a&&!b&&!c&&!d)return e}return!1}function f(b, +c,d,f){return(b=i(b,c,d,f))?(a&&!b.json&&e("is not valid json",b),O.shift(),b):!1}function h(a){f(a)||e("is unexpected, expecting ["+a+"]",i())}function j(a,b){return t(function(c,d){return a(c,d,b)},{constant:b.constant})}function m(a,b,c){return t(function(d,e){return a(d,e)?b(d,e):c(d,e)},{constant:a.constant&&b.constant&&c.constant})}function k(a,b,c){return t(function(d,e){return b(d,e,a,c)},{constant:a.constant&&c.constant})}function l(){for(var a=[];;)if(O.length>0&&!i("}",")",";","]")&&a.push(v()), +!f(";"))return a.length==1?a[0]:function(b,c){for(var d,e=0;e","<=",">="))a=k(a,b.fn,x());return a}function n(){for(var a=w(),b;b=f("*","/","%");)a=k(a,b.fn,w());return a}function w(){var a;return f("+")?A():(a=f("-"))?k($,a.fn,w()):(a=f("!"))?j(a.fn,w()):A()}function A(){var a;if(f("("))a=v(),h(")");else if(f("["))a=G();else if(f("{"))a=D();else{var b=f();(a= +b.fn)||e("not a primary expression",b);if(b.json)a.constant=a.literal=!0}for(var c;b=f("(","[",".");)b.text==="("?(a=s(a,c),c=null):b.text==="["?(c=a,a=ma(a)):b.text==="."?(c=a,a=ja(a)):e("IMPOSSIBLE");return a}function G(){var a=[],b=!0;if(g().text!="]"){do{var c=P();a.push(c);c.constant||(b=!1)}while(f(","))}h("]");return t(function(b,c){for(var d=[],e=0;e1;d++){var e=a.shift(),g=b[e];g||(g={},b[e]=g);b=g}return b[a.shift()]=c}function ib(b,a,c){if(!a)return b;for(var a=a.split("."),d,e=b,g=a.length,i=0;ia)for(b in g++,e)e.hasOwnProperty(b)&&!f.hasOwnProperty(b)&&(x--,delete e[b])}else e!==f&&(e=f,g++);return g}, +function(){b(f,e,c)})},$digest:function(){var a,d,e,i,u=this.$$asyncQueue,o,z,r=b,n,x=[],p,w;g("$digest");do{z=!1;for(n=this;u.length;)try{n.$eval(u.shift())}catch(A){c(A)}do{if(i=n.$$watchers)for(o=i.length;o--;)try{if(a=i[o],(d=a.get(n))!==(e=a.last)&&!(a.eq?ia(d,e):typeof d=="number"&&typeof e=="number"&&isNaN(d)&&isNaN(e)))z=!0,a.last=a.eq?V(d):d,a.fn(d,e===f?d:e,n),r<5&&(p=4-r,x[p]||(x[p]=[]),w=H(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,w+="; newVal: "+ha(d)+"; oldVal: "+ha(e),x[p].push(w))}catch(G){c(G)}if(!(i= +n.$$childHead||n!==this&&n.$$nextSibling))for(;n!==this&&!(i=n.$$nextSibling);)n=n.$parent}while(n=i);if(z&&!r--)throw h.$$phase=null,Error(b+" $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: "+ha(x));}while(z||u.length);h.$$phase=null},$destroy:function(){if(!(h==this||this.$$destroyed)){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(a.$$childHead==this)a.$$childHead=this.$$nextSibling;if(a.$$childTail==this)a.$$childTail=this.$$prevSibling; +if(this.$$prevSibling)this.$$prevSibling.$$nextSibling=this.$$nextSibling;if(this.$$nextSibling)this.$$nextSibling.$$prevSibling=this.$$prevSibling;this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null}},$eval:function(a,b){return d(a)(this,b)},$evalAsync:function(a){this.$$asyncQueue.push(a)},$apply:function(a){try{return g("$apply"),this.$eval(a)}catch(b){c(b)}finally{h.$$phase=null;try{h.$digest()}catch(d){throw c(d),d;}}},$on:function(a,b){var c=this.$$listeners[a]; +c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[Ga(c,b)]=null}},$emit:function(a,b){var d=[],e,f=this,g=!1,i={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},h=[i].concat(ka.call(arguments,1)),n,x;do{e=f.$$listeners[a]||d;i.currentScope=f;n=0;for(x=e.length;n7),hasEvent:function(a){if(a=="input"&&Z==9)return!1;if(C(c[a])){var b= +e.createElement("div");c[a]="on"+a in b}return c[a]},csp:e.securityPolicy?e.securityPolicy.isActive:!1,vendorPrefix:g,transitions:h,animations:j}}]}function Zc(){this.$get=S(M)}function Wb(b){var a={},c,d,e;if(!b)return a;n(b.split("\n"),function(b){e=b.indexOf(":");c=I(U(b.substr(0,e)));d=U(b.substr(e+1));c&&(a[c]?a[c]+=", "+d:a[c]=d)});return a}function $c(b,a){var c=ad.exec(b);if(c==null)return!0;var d={protocol:c[2],host:c[4],port:N(c[6])||Oa[c[2]]||null,relativeProtocol:c[2]===p||c[2]===""}, +c=jb.exec(a),c={protocol:c[1],host:c[3],port:N(c[5])||Oa[c[1]]||null};return(d.protocol==c.protocol||d.relativeProtocol)&&d.host==c.host&&(d.port==c.port||d.relativeProtocol&&c.port==Oa[c.protocol])}function Xb(b){var a=L(b)?b:p;return function(c){a||(a=Wb(b));return c?a[I(c)]||null:a}}function Yb(b,a,c){if(H(c))return c(b,a);n(c,function(c){b=c(b,a)});return b}function bd(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults= +{transformResponse:[function(d){E(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=ub(d,!0)));return d}],transformRequest:[function(a){return L(a)&&Ea.apply(a)!=="[object File]"?ha(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:d,put:d,patch:d},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},g=this.interceptors=[],i=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,k,l){function u(a){function c(a){var b= +t({},a,{data:Yb(a.data,a.headers,d.transformResponse)});return 200<=a.status&&a.status<300?b:k.reject(b)}var d={transformRequest:e.transformRequest,transformResponse:e.transformResponse},f={};t(d,a);d.headers=f;d.method=oa(d.method);t(f,e.headers.common,e.headers[I(d.method)],a.headers);(a=$c(d.url,b.url())?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:p)&&(f[d.xsrfHeaderName||e.xsrfHeaderName]=a);var g=[function(a){var b=Yb(a.data,Xb(f),a.transformRequest);C(a.data)&&delete f["Content-Type"];if(C(a.withCredentials)&& +!C(e.withCredentials))a.withCredentials=e.withCredentials;return o(a,b,f).then(c,c)},p],j=k.when(d);for(n(y,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;)var a=g.shift(),i=g.shift(),j=j.then(a,i);j.success=function(a){j.then(function(b){a(b.data,b.status,b.headers,d)});return j};j.error=function(a){j.then(null,function(b){a(b.data,b.status,b.headers,d)});return j};return j}function o(b,c,g){function j(a, +b,c){n&&(200<=a&&a<300?n.put(s,[a,b,Wb(c)]):n.remove(s));i(b,a,c);d.$$phase||d.$apply()}function i(a,c,d){c=Math.max(c,0);(200<=c&&c<300?l.resolve:l.reject)({data:a,status:c,headers:Xb(d),config:b})}function h(){var a=Ga(u.pendingRequests,b);a!==-1&&u.pendingRequests.splice(a,1)}var l=k.defer(),o=l.promise,n,p,s=z(b.url,b.params);u.pendingRequests.push(b);o.then(h,h);if((b.cache||e.cache)&&b.cache!==!1&&b.method=="GET")n=L(b.cache)?b.cache:L(e.cache)?e.cache:r;if(n)if(p=n.get(s))if(p.then)return p.then(h, +h),p;else F(p)?i(p[1],p[0],V(p[2])):i(p,200,{});else n.put(s,o);p||a(b.method,s,c,j,g,b.timeout,b.withCredentials,b.responseType);return o}function z(a,b){if(!b)return a;var c=[];nc(b,function(a,b){a==null||a==p||(F(a)||(a=[a]),n(a,function(a){L(a)&&(a=ha(a));c.push(wa(b)+"="+wa(a))}))});return a+(a.indexOf("?")==-1?"?":"&")+c.join("&")}var r=c("$http"),y=[];n(g,function(a){y.unshift(E(a)?l.get(a):l.invoke(a))});n(i,function(a,b){var c=E(a)?l.get(a):l.invoke(a);y.splice(b,0,{response:function(a){return c(k.when(a))}, +responseError:function(a){return c(k.reject(a))}})});u.pendingRequests=[];(function(a){n(arguments,function(a){u[a]=function(b,c){return u(t(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){n(arguments,function(a){u[a]=function(b,c,d){return u(t(d||{},{method:a,url:b,data:c}))}})})("post","put");u.defaults=e;return u}]}function cd(){this.$get=["$browser","$window","$document",function(b,a,c){return dd(b,ed,b.defer,a.angular.callbacks,c[0],a.location.protocol.replace(":",""))}]} +function dd(b,a,c,d,e,g){function i(a,b){var c=e.createElement("script"),d=function(){e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;Z?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=d;e.body.appendChild(c);return d}return function(e,h,j,m,k,l,u,o){function z(){p=-1;t&&t();w&&w.abort()}function r(a,d,e,f){var j=(h.match(jb)||["",g])[1];A&&c.cancel(A);t=w=null;d=j=="file"?e?200:404:d;a(d==1223?204:d,e,f);b.$$completeOutstandingRequest(q)} +var p;b.$$incOutstandingRequestCount();h=h||b.url();if(I(e)=="jsonp"){var x="_"+(d.counter++).toString(36);d[x]=function(a){d[x].data=a};var t=i(h.replace("JSON_CALLBACK","angular.callbacks."+x),function(){d[x].data?r(m,200,d[x].data):r(m,p||-2);delete d[x]})}else{var w=new a;w.open(e,h,!0);n(k,function(a,b){a&&w.setRequestHeader(b,a)});w.onreadystatechange=function(){if(w.readyState==4){var a=w.getAllResponseHeaders(),b=["Cache-Control","Content-Language","Content-Type","Expires","Last-Modified", +"Pragma"];a||(a="",n(b,function(b){var c=w.getResponseHeader(b);c&&(a+=b+": "+c+"\n")}));r(m,p||w.status,w.responseType?w.response:w.responseText,a)}};if(u)w.withCredentials=!0;if(o)w.responseType=o;w.send(j||"")}if(l>0)var A=c(z,l);else l&&l.then&&l.then(z)}}function fd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4", +posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),SHORTMONTH:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),DAY:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),SHORTDAY:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y", +mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return b===1?"one":"other"}}}}function gd(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,f,h){var j=c.defer(),m=j.promise,k=B(h)&&!h,f=a.defer(function(){try{j.resolve(e())}catch(a){j.reject(a),d(a)}k||b.$apply()},f),h=function(){delete g[m.$$timeoutId]};m.$$timeoutId=f;g[f]=j;m.then(h,h);return m}var g={};e.cancel=function(b){return b&&b.$$timeoutId in +g?(g[b.$$timeoutId].reject("canceled"),a.defer.cancel(b.$$timeoutId)):!1};return e}]}function Zb(b){function a(a,e){return b.factory(a+c,e)}var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",$b);a("date",ac);a("filter",hd);a("json",id);a("limitTo",jd);a("lowercase",kd);a("number",bc);a("orderBy",cc);a("uppercase",ld)}function hd(){return function(b,a,c){if(!F(b))return b;var d=[];d.check=function(a){for(var b=0;b-1}}var e=function(a,b){if(typeof b=="string"&&b.charAt(0)==="!")return!e(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if(d.charAt(0)!=="$"&&e(a[d],b))return!0}return!1;case "array":for(d= +0;de+1?i="0":(f=i,j=!0)}if(!j){i=(i.split(ec)[1]||"").length;C(e)&&(e=Math.min(Math.max(a.minFrac,i), +a.maxFrac));var i=Math.pow(10,e),b=Math.round(b*i)/i,b=(""+b).split(ec),i=b[0],b=b[1]||"",j=0,m=a.lgSize,k=a.gSize;if(i.length>=m+k)for(var j=i.length-m,l=0;l0||e>-c)e+=c;e===0&&c==-12&&(e=12);return nb(e,a,d)}}function Qa(b,a){return function(c,d){var e=c["get"+b](),g=oa(a?"SHORT"+b:b);return d[g][e]}}function ac(b){function a(a){var b;if(b=a.match(c)){var a=new Date(0),g=0,i=0,f=b[8]?a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(g=N(b[9]+b[10]),i=N(b[9]+b[11]));f.call(a,N(b[1]),N(b[2])-1,N(b[3]));g=N(b[4]||0)-g;i=N(b[5]||0)-i;f= +N(b[6]||0);b=Math.round(parseFloat("0."+(b[7]||0))*1E3);h.call(a,g,i,f,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var g="",i=[],f,h,e=e||"mediumDate",e=b.DATETIME_FORMATS[e]||e;E(c)&&(c=md.test(c)?N(c):a(c));Ya(c)&&(c=new Date(c));if(!ra(c))return c;for(;e;)(h=nd.exec(e))?(i=i.concat(ka.call(h,1)),e=i.pop()):(i.push(e),e=null);n(i,function(a){f=od[a];g+=f?f(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g, +"").replace(/''/g,"'")});return g}}function id(){return function(b){return ha(b,!0)}}function jd(){return function(b,a){if(!F(b)&&!E(b))return b;a=N(a);if(E(b))return a?a>=0?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);a>0?(d=0,e=a):(d=b.length+a,e=b.length);for(;dl?(d.$setValidity("maxlength",!1),p):(d.$setValidity("maxlength",!0),a)};d.$parsers.push(e);d.$formatters.push(e)}}function ob(b,a){b="ngClass"+b;return aa(function(c,d,e){function g(b){if(a===!0||c.$index%2===a)h&&!ia(b,h)&&i(h),f(b);h=V(b)}function i(a){L(a)&&!F(a)&&(a=Za(a,function(a,b){if(a)return b}));d.removeClass(F(a)?a.join(" "):a)}function f(a){L(a)&&!F(a)&&(a=Za(a, +function(a,b){if(a)return b}));a&&d.addClass(F(a)?a.join(" "):a)}var h=p;c.$watch(e[b],g,!0);e.$observe("class",function(){var a=c.$eval(e[b]);g(a,a)});b!=="ngClass"&&c.$watch("$index",function(d,g){var h=d&1;h!==g&1&&(h===a?f(c.$eval(e[b])):i(c.$eval(e[b])))})})}var I=function(b){return E(b)?b.toLowerCase():b},oa=function(b){return E(b)?b.toUpperCase():b},Z=N((/msie (\d+)/.exec(I(navigator.userAgent))||[])[1]),v,ga,ka=[].slice,Wa=[].push,Ea=Object.prototype.toString,mc=M.angular,Ha=M.angular||(M.angular= +{}),Aa,hb,ba=["0","0","0"];q.$inject=[];qa.$inject=[];hb=Z<9?function(b){b=b.nodeName?b:b[0];return b.scopeName&&b.scopeName!="HTML"?oa(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var sc=/[A-Z]/g,pd={full:"1.1.5",major:1,minor:1,dot:5,codeName:"triangle-squarification"},Ka=R.cache={},Ja=R.expando="ng-"+(new Date).getTime(),wc=1,gc=M.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},gb= +M.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},uc=/([\:\-\_]+(.))/g,vc=/^moz([A-Z])/,Ba=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;T.readyState==="complete"?setTimeout(a):(this.bind("DOMContentLoaded",a),R(M).bind("load",a))},toString:function(){var b=[];n(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return b>=0?v(this[b]):v(this[this.length+b])},length:0,push:Wa,sort:[].sort, +splice:[].splice},Na={};n("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(b){Na[I(b)]=b});var Gb={};n("input,select,option,textarea,button,form,details".split(","),function(b){Gb[oa(b)]=!0});n({data:Bb,inheritedData:Ma,scope:function(b){return Ma(b,"$scope")},controller:Eb,injector:function(b){return Ma(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:La,css:function(b,a,c){a=Ia(a);if(B(c))b.style[a]=c;else{var d;Z<=8&&(d=b.currentStyle&&b.currentStyle[a], +d===""&&(d="auto"));d=d||b.style[a];Z<=8&&(d=d===""?p:d);return d}},attr:function(b,a,c){var d=I(a);if(Na[d])if(B(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||q).specified?d:p;else if(B(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),b===null?p:b},prop:function(b,a,c){if(B(c))b[a]=c;else return b[a]},text:t(Z<9?function(b,a){if(b.nodeType==1){if(C(a))return b.innerText;b.innerText=a}else{if(C(a))return b.nodeValue; +b.nodeValue=a}}:function(b,a){if(C(a))return b.textContent;b.textContent=a},{$dv:""}),val:function(b,a){if(C(a))return b.value;b.value=a},html:function(b,a){if(C(a))return b.innerHTML;for(var c=0,d=b.childNodes;c0||parseFloat(h[a+"Duration"])> +0)g="animation",i=a,j=Math.max(parseInt(h[g+"IterationCount"])||0,parseInt(h[i+"IterationCount"])||0,j);f=Math.max(x(h[g+"Delay"]),x(h[i+"Delay"]));g=Math.max(x(h[g+"Duration"]),x(h[i+"Duration"]));d=Math.max(f+j*g,d)}});e.setTimeout(w,d*1E3)}else w()}function w(){if(!w.run)w.run=!0,o(m,r,p),m.removeClass(v),m.removeClass(K),m.removeData(a)}var A=c.$eval(i.ngAnimate),v=A?L(A)?A[j]:A+"-"+j:"",D=d(v),A=D&&D.setup,$=D&&D.start,D=D&&D.cancel;if(v){var K=v+"-active";r||(r=p?p.parent():m.parent());if(!g.transitions&& +!A&&!$||(r.inheritedData(a)||q).running)k(m,r,p),o(m,r,p);else{var O=m.data(a)||{};O.running&&((D||q)(m),O.done());m.data(a,{running:!0,done:w});m.addClass(v);k(m,r,p);if(m.length==0)return w();var P=(A||q)(m);e.setTimeout(t,1)}}else k(m,r,p),o(m,r,p)}}function m(a,c,d){d?d.after(a):c.append(a)}var k={};k.enter=j("enter",m,q);k.leave=j("leave",q,function(a){a.remove()});k.move=j("move",function(a,c,d){m(a,c,d)},q);k.show=j("show",function(a){a.css("display","")},q);k.hide=j("hide",q,function(a){a.css("display", +"none")});k.animate=function(a,c){j(a,q,q)(c)};return k};i.enabled=function(a){if(arguments.length)c.running=!a;return!c.running};return i}]},Kb="Non-assignable model expression: ";Jb.$inject=["$provide"];var Ic=/^(x[\:\-_]|data[\:\-_])/i,jb=/^([^:]+):\/\/(\w+:{0,1}\w*@)?(\{?[\w\.-]*\}?)(:([0-9]+))?(\/[^\?#]*)?(\?([^#]*))?(#(.*))?$/,Pb=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,Oa={http:80,https:443,ftp:21};Rb.prototype=lb.prototype=Qb.prototype={$$replace:!1,absUrl:Pa("$$absUrl"),url:function(a,c){if(C(a))return this.$$url; +var d=Pb.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));if(d[2]||d[1])this.search(d[3]||"");this.hash(d[5]||"",c);return this},protocol:Pa("$$protocol"),host:Pa("$$host"),port:Pa("$$port"),path:Sb("$$path",function(a){return a.charAt(0)=="/"?a:"/"+a}),search:function(a,c){if(C(a))return this.$$search;B(c)?c===null?delete this.$$search[a]:this.$$search[a]=c:this.$$search=E(a)?vb(a):a;this.$$compose();return this},hash:Sb("$$hash",qa),replace:function(){this.$$replace=!0;return this}};var Da={"null":function(){return null}, +"true":function(){return!0},"false":function(){return!1},undefined:q,"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return B(d)?B(e)?d+e:d:B(e)?e:p},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(B(d)?d:0)-(B(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"^":function(a,c,d,e){return d(a,c)^e(a,c)},"=":q,"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a, +c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Qc={n:"\n",f:"\u000c",r:"\r", +t:"\t",v:"\u000b","'":"'",'"':'"'},mb={},ad=/^(([^:]+):)?\/\/(\w+:{0,1}\w*@)?([\w\.-]*)?(:([0-9]+))?(.*)$/,ed=M.XMLHttpRequest||function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");};Zb.$inject=["$provide"];$b.$inject=["$locale"];bc.$inject=["$locale"];var ec=".",od={yyyy:Q("FullYear",4),yy:Q("FullYear", +2,0,!0),y:Q("FullYear",1),MMMM:Qa("Month"),MMM:Qa("Month",!0),MM:Q("Month",2,1),M:Q("Month",1,1),dd:Q("Date",2),d:Q("Date",1),HH:Q("Hours",2),H:Q("Hours",1),hh:Q("Hours",2,-12),h:Q("Hours",1,-12),mm:Q("Minutes",2),m:Q("Minutes",1),ss:Q("Seconds",2),s:Q("Seconds",1),sss:Q("Milliseconds",3),EEEE:Qa("Day"),EEE:Qa("Day",!0),a:function(a,c){return a.getHours()<12?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){var a=-1*a.getTimezoneOffset(),c=a>=0?"+":"";c+=nb(Math[a>0?"floor":"ceil"](a/60),2)+nb(Math.abs(a%60), +2);return c}},nd=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,md=/^\d+$/;ac.$inject=["$locale"];var kd=S(I),ld=S(oa);cc.$inject=["$parse"];var rd=S({restrict:"E",compile:function(a,c){Z<=8&&(!c.href&&!c.name&&c.$set("href",""),a.append(T.createComment("IE fix")));return function(a,c){c.bind("click",function(a){c.attr("href")||a.preventDefault()})}}}),pb={};n(Na,function(a,c){var d=da("ng-"+c);pb[d]=function(){return{priority:100,compile:function(){return function(a, +g,i){a.$watch(i[d],function(a){i.$set(c,!!a)})}}}}});n(["src","srcset","href"],function(a){var c=da("ng-"+a);pb[c]=function(){return{priority:99,link:function(d,e,g){g.$observe(c,function(c){c&&(g.$set(a,c),Z&&e.prop(a,g[a]))})}}}});var Ta={$addControl:q,$removeControl:q,$setValidity:q,$setDirty:q,$setPristine:q};fc.$inject=["$element","$attrs","$scope"];var Wa=function(a){return["$timeout",function(c){var d={name:"form",restrict:"E",controller:fc,compile:function(){return{pre:function(a,d,i,f){if(!i.action){var h= +function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};gc(d[0],"submit",h);d.bind("$destroy",function(){c(function(){gb(d[0],"submit",h)},0,!1)})}var j=d.parent().controller("form"),m=i.name||i.ngForm;m&&(a[m]=f);j&&d.bind("$destroy",function(){j.$removeControl(f);m&&(a[m]=p);t(f,Ta)})}}}};return a?t(V(d),{restrict:"EAC"}):d}]},sd=Wa(),td=Wa(!0),ud=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,vd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/, +wd=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,hc={text:Va,number:function(a,c,d,e,g,i){Va(a,c,d,e,g,i);e.$parsers.push(function(a){var c=X(a);return c||wd.test(a)?(e.$setValidity("number",!0),a===""?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),p)});e.$formatters.push(function(a){return X(a)?"":""+a});if(d.min){var f=parseFloat(d.min),a=function(a){return!X(a)&&ah?(e.$setValidity("max",!1),p):(e.$setValidity("max",!0),a)};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){return X(a)||Ya(a)?(e.$setValidity("number",!0),a):(e.$setValidity("number",!1),p)})},url:function(a,c,d,e,g,i){Va(a,c,d,e,g,i);a=function(a){return X(a)||ud.test(a)?(e.$setValidity("url",!0),a):(e.$setValidity("url",!1),p)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,g,i){Va(a,c,d,e,g,i);a=function(a){return X(a)||vd.test(a)? +(e.$setValidity("email",!0),a):(e.$setValidity("email",!1),p)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){C(d.name)&&c.attr("name",Fa());c.bind("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,i=d.ngFalseValue;E(g)||(g=!0);E(i)||(i=!1);c.bind("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})}); +e.$render=function(){c[0].checked=e.$viewValue};e.$formatters.push(function(a){return a===g});e.$parsers.push(function(a){return a?g:i})},hidden:q,button:q,submit:q,reset:q},ic=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,g,i){i&&(hc[I(g.type)]||hc.text)(d,e,g,i,c,a)}}}],Sa="ng-valid",Ra="ng-invalid",pa="ng-pristine",Ua="ng-dirty",xd=["$scope","$exceptionHandler","$attrs","$element","$parse",function(a,c,d,e,g){function i(a,c){c=c?"-"+bb(c,"-"):""; +e.removeClass((a?Ra:Sa)+c).addClass((a?Sa:Ra)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var f=g(d.ngModel),h=f.assign;if(!h)throw Error(Kb+d.ngModel+" ("+va(e)+")");this.$render=q;var j=e.inheritedData("$formController")||Ta,m=0,k=this.$error={};e.addClass(pa);i(!0);this.$setValidity=function(a,c){if(k[a]!==!c){if(c){if(k[a]&&m--,!m)i(!0),this.$valid= +!0,this.$invalid=!1}else i(!1),this.$invalid=!0,this.$valid=!1,m++;k[a]=!c;i(c,a);j.$setValidity(a,c,this)}};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;e.removeClass(Ua).addClass(pa)};this.$setViewValue=function(d){this.$viewValue=d;if(this.$pristine)this.$dirty=!0,this.$pristine=!1,e.removeClass(pa).addClass(Ua),j.$setDirty();n(this.$parsers,function(a){d=a(d)});if(this.$modelValue!==d)this.$modelValue=d,h(a,d),n(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})}; +var l=this;a.$watch(function(){var c=f(a);if(l.$modelValue!==c){var d=l.$formatters,e=d.length;for(l.$modelValue=c;e--;)c=d[e](c);if(l.$viewValue!==c)l.$viewValue=c,l.$render()}})}],yd=function(){return{require:["ngModel","^?form"],controller:xd,link:function(a,c,d,e){var g=e[0],i=e[1]||Ta;i.$addControl(g);c.bind("$destroy",function(){i.$removeControl(g)})}}},zd=S({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),jc=function(){return{require:"?ngModel", +link:function(a,c,d,e){if(e){d.required=!0;var g=function(a){if(d.required&&(X(a)||a===!1))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(g);e.$parsers.unshift(g);d.$observe("required",function(){g(e.$viewValue)})}}}},Ad=function(){return{require:"ngModel",link:function(a,c,d,e){var g=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){var c=[];a&&n(a.split(g),function(a){a&&c.push(U(a))});return c});e.$formatters.push(function(a){return F(a)? +a.join(", "):p})}}},Bd=/^(true|false|\d+)$/,Cd=function(){return{priority:100,compile:function(a,c){return Bd.test(c.ngValue)?function(a,c,g){g.$set("value",a.$eval(g.ngValue))}:function(a,c,g){a.$watch(g.ngValue,function(a){g.$set("value",a,!1)})}}}},Dd=aa(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==p?"":a)})}),Ed=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding", +c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],Fd=[function(){return function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBindHtmlUnsafe);a.$watch(d.ngBindHtmlUnsafe,function(a){c.html(a||"")})}}],Gd=ob("",!0),Hd=ob("Odd",0),Id=ob("Even",1),Jd=aa({compile:function(a,c){c.$set("ngCloak",p);a.removeClass("ng-cloak")}}),Kd=[function(){return{scope:!0,controller:"@"}}],Ld=["$sniffer",function(a){return{priority:1E3,compile:function(){a.csp=!0}}}],kc={};n("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress".split(" "), +function(a){var c=da("ng-"+a);kc[c]=["$parse",function(d){return function(e,g,i){var f=d(i[c]);g.bind(I(a),function(a){e.$apply(function(){f(e,{$event:a})})})}}]});var Md=aa(function(a,c,d){c.bind("submit",function(){a.$apply(d.ngSubmit)})}),Nd=["$animator",function(a){return{transclude:"element",priority:1E3,terminal:!0,restrict:"A",compile:function(c,d,e){return function(c,d,f){var h=a(c,f),j,m;c.$watch(f.ngIf,function(a){j&&(h.leave(j),j=p);m&&(m.$destroy(),m=p);ua(a)&&(m=c.$new(),e(m,function(a){j= +a;h.enter(a,d.parent(),d)}))})}}}}],Od=["$http","$templateCache","$anchorScroll","$compile","$animator",function(a,c,d,e,g){return{restrict:"ECA",terminal:!0,compile:function(i,f){var h=f.ngInclude||f.src,j=f.onload||"",m=f.autoscroll;return function(f,i,n){var o=g(f,n),p=0,r,t=function(){r&&(r.$destroy(),r=null);o.leave(i.contents(),i)};f.$watch(h,function(g){var h=++p;g?(a.get(g,{cache:c}).success(function(a){h===p&&(r&&r.$destroy(),r=f.$new(),o.leave(i.contents(),i),a=v("
").html(a).contents(), +o.enter(a,i),e(a)(r),B(m)&&(!m||f.$eval(m))&&d(),r.$emit("$includeContentLoaded"),f.$eval(j))}).error(function(){h===p&&t()}),f.$emit("$includeContentRequested")):t()})}}}}],Pd=aa({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Qd=aa({terminal:!0,priority:1E3}),Rd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,g,i){var f=i.count,h=g.attr(i.$attr.when),j=i.offset||0,m=e.$eval(h),k={},l=c.startSymbol(),p=c.endSymbol();n(m,function(a,e){k[e]= +c(a.replace(d,l+f+"-"+j+p))});e.$watch(function(){var c=parseFloat(e.$eval(f));return isNaN(c)?"":(c in m||(c=a.pluralCat(c-j)),k[c](e,g,!0))},function(a){g.text(a)})}}}],Sd=["$parse","$animator",function(a,c){return{transclude:"element",priority:1E3,terminal:!0,compile:function(d,e,g){return function(d,e,h){var j=c(d,h),m=h.ngRepeat,k=m.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),l,p,o,z,r,t={$id:la};if(!k)throw Error("Expected ngRepeat in form of '_item_ in _collection_[ track by _id_]' but got '"+ +m+"'.");h=k[1];o=k[2];(k=k[4])?(l=a(k),p=function(a,c,e){r&&(t[r]=a);t[z]=c;t.$index=e;return l(d,t)}):p=function(a,c){return la(c)};k=h.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!k)throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '"+h+"'.");z=k[3]||k[1];r=k[2];var x={};d.$watchCollection(o,function(a){var c,h,k=e,l,o={},t,q,v,s,B,y,C=[];if(Xa(a))B=a;else{B=[];for(v in a)a.hasOwnProperty(v)&&v.charAt(0)!="$"&&B.push(v);B.sort()}t=B.length;h= +C.length=B.length;for(c=0;c
").html(k).contents();o.enter(k,c);var k=g(k),m=d.current;l=m.scope=a.$new();if(m.controller)f.$scope= +l,f=i(m.controller,f),m.controllerAs&&(l[m.controllerAs]=f),c.children().data("$ngControllerController",f);k(l);l.$emit("$viewContentLoaded");l.$eval(n);e()}else o.leave(c.contents(),c),l&&(l.$destroy(),l=null)}var l,n=m.onload||"",o=f(a,m);a.$on("$routeChangeSuccess",k);k()}}}],ae=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){d.type=="text/ng-template"&&a.put(d.id,c[0].text)}}}],be=S({terminal:!0}),ce=["$compile","$parse",function(a,c){var d=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/, +e={$setViewValue:q};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var h=this,j={},m=e,k;h.databound=d.ngModel;h.init=function(a,c,d){m=a;k=d};h.addOption=function(c){j[c]=!0;m.$viewValue==c&&(a.val(c),k.parent()&&k.remove())};h.removeOption=function(a){this.hasOption(a)&&(delete j[a],m.$viewValue==a&&this.renderUnknownOption(a))};h.renderUnknownOption=function(c){c="? "+la(c)+" ?";k.val(c);a.prepend(k);a.val(c);k.prop("selected",!0)};h.hasOption= +function(a){return j.hasOwnProperty(a)};c.$on("$destroy",function(){h.renderUnknownOption=q})}],link:function(e,i,f,h){function j(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(w.parent()&&w.remove(),c.val(a),a===""&&t.prop("selected",!0)):C(a)&&t?c.val(""):e.renderUnknownOption(a)};c.bind("change",function(){a.$apply(function(){w.parent()&&w.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new za(d.$viewValue);n(c.find("option"),function(c){c.selected= +B(a.get(c.value))})};a.$watch(function(){ia(e,d.$viewValue)||(e=V(d.$viewValue),d.$render())});c.bind("change",function(){a.$apply(function(){var a=[];n(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function k(e,f,g){function i(){var a={"":[]},c=[""],d,h,q,w,s;q=g.$modelValue;w=u(e)||[];var z=l?qb(w):w,B,y,A;y={};s=!1;var C,D;if(o)if(t&&F(q)){s=new za([]);for(h=0;hA;)w.pop().element.remove()}for(;v.length>y;)v.pop()[0].element.remove()}var h; +if(!(h=q.match(d)))throw Error("Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_ (track by _expr_)?' but got '"+q+"'.");var j=c(h[2]||h[1]),k=h[4]||h[6],l=h[5],m=c(h[3]||""),n=c(h[2]?h[1]:k),u=c(h[7]),t=h[8]?c(h[8]):null,v=[[{element:f,label:""}]];r&&(a(r)(e),r.removeClass("ng-scope"),r.remove());f.html("");f.bind("change",function(){e.$apply(function(){var a,c=u(e)||[],d={},h,i,j,m,q,r;if(o){i=[];m=0;for(r=v.length;m1&&v[0][1].id!==h)v[0][1].selected=!1}g.$setViewValue(i)})});g.$render=i;e.$watch(i)}if(h[1]){for(var l=h[0],u=h[1],o=f.multiple,q=f.ngOptions,r=!1,t,x=v(T.createElement("option")),E= +v(T.createElement("optgroup")),w=x.clone(),h=0,A=i.children(),G=A.length;h@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none;}ng\\:form{display:block;}'); From e90fedb835e93e2fe052df24ea7f873ac2c3f856 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 8 Dec 2015 13:54:43 +0100 Subject: [PATCH 08/27] Bumps version --- build/UmbracoVersion.txt | 2 +- src/SolutionInfo.cs | 4 ++-- src/Umbraco.Core/Configuration/UmbracoVersion.cs | 2 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/UmbracoVersion.txt b/build/UmbracoVersion.txt index a32aeaace9..71c6f2956c 100644 --- a/build/UmbracoVersion.txt +++ b/build/UmbracoVersion.txt @@ -1,2 +1,2 @@ # Usage: on line 2 put the release version, on line 3 put the version comment (example: beta) -7.3.3 \ No newline at end of file +7.3.4 \ No newline at end of file diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index a58f46be1b..a8ea69e06e 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -11,5 +11,5 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("7.3.3")] -[assembly: AssemblyInformationalVersion("7.3.3")] \ No newline at end of file +[assembly: AssemblyFileVersion("7.3.4")] +[assembly: AssemblyInformationalVersion("7.3.4")] \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 04719befd9..c2cafcfe2e 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration { public class UmbracoVersion { - private static readonly Version Version = new Version("7.3.3"); + private static readonly Version Version = new Version("7.3.4"); /// /// Gets the current version of Umbraco. diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 320f6dc22d..4532f568e6 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2413,9 +2413,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.0\x86\*.* "$(TargetDir)x86\" True True - 7330 + 7340 / - http://localhost:7330 + http://localhost:7340 False False From a1013672920b54734b403fbc3b4d092cfcc71d76 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 8 Dec 2015 14:02:43 +0100 Subject: [PATCH 09/27] This would've stayed here for years and be irrelevant, we can link to twitter profiles in the docs on Our --- src/Umbraco.Web.UI/umbraco/config/lang/de.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml index 43775b3773..895717c698 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml @@ -1,8 +1,8 @@ - The German Umbraco community - Contributors welcome. Find us on Twitter: @merkledo, @SoerenDeger, @esn303, @thoehler + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files Hostnamen verwalten From 220446afec54d358ee6bbf5c70d6b48cbd4f7c88 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 8 Dec 2015 14:24:52 +0100 Subject: [PATCH 10/27] Adds some more dependencies so we upgrade those properly when necessary --- build/NuSpecs/tools/install.core.ps1 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/build/NuSpecs/tools/install.core.ps1 b/build/NuSpecs/tools/install.core.ps1 index 6213957221..ba6416028b 100644 --- a/build/NuSpecs/tools/install.core.ps1 +++ b/build/NuSpecs/tools/install.core.ps1 @@ -57,14 +57,25 @@ if ($project) { if(Test-Path $umbracoBinFolder\ImageProcessor.dll) { Remove-Item $umbracoBinFolder\ImageProcessor.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\ImageProcessor.Web.dll) { Remove-Item $umbracoBinFolder\ImageProcessor.Web.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\Lucene.Net.dll) { Remove-Item $umbracoBinFolder\Lucene.Net.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Microsoft.AspNet.Identity.Core.dll) { Remove-Item $umbracoBinFolder\Microsoft.AspNet.Identity.Core.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Microsoft.AspNet.Identity.Owin.dll) { Remove-Item $umbracoBinFolder\Microsoft.AspNet.Identity.Owin.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Microsoft.Owin.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Microsoft.Owin.Host.SystemWeb.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Host.SystemWeb.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.Cookies.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.Cookies.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Microsoft.Owin.Security.OAuth.dll) { Remove-Item $umbracoBinFolder\Microsoft.Owin.Security.OAuth.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\Microsoft.Web.Infrastructure.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Infrastructure.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\Microsoft.Web.Helpers.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Helpers.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\Microsoft.Web.Mvc.FixedDisplayModes.dll) { Remove-Item $umbracoBinFolder\Microsoft.Web.Mvc.FixedDisplayModes.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\MiniProfiler.dll) { Remove-Item $umbracoBinFolder\MiniProfiler.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\MySql.Data.dll) { Remove-Item $umbracoBinFolder\MySql.Data.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\Newtonsoft.Json.dll) { Remove-Item $umbracoBinFolder\Newtonsoft.Json.dll -Force -Confirm:$false } - if(Test-Path $umbracoBinFolder\System.Web.Helpers.dll) { Remove-Item $umbracoBinFolder\System.Web.Helpers.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Owin.dll) { Remove-Item $umbracoBinFolder\Owin.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\Semver.dll) { Remove-Item $umbracoBinFolder\Semver.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\System.Net.Http.Extensions.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Extensions.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\System.Net.Http.Formatting.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Formatting.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\System.Net.Http.Primitives.dll) { Remove-Item $umbracoBinFolder\System.Net.Http.Primitives.dll -Force -Confirm:$false } + if(Test-Path $umbracoBinFolder\System.Web.Helpers.dll) { Remove-Item $umbracoBinFolder\System.Web.Helpers.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\System.Web.Http.dll) { Remove-Item $umbracoBinFolder\System.Web.Http.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\System.Web.Http.WebHost.dll) { Remove-Item $umbracoBinFolder\System.Web.Http.WebHost.dll -Force -Confirm:$false } if(Test-Path $umbracoBinFolder\System.Web.Mvc.dll) { Remove-Item $umbracoBinFolder\System.Web.Mvc.dll -Force -Confirm:$false } From aed906e682463433f6dac67e8bcd2273361f7250 Mon Sep 17 00:00:00 2001 From: Alexander Todorov Date: Tue, 8 Dec 2015 18:41:59 +0200 Subject: [PATCH 11/27] U4-7508 - IsChildOfListView should be populated for Media items, similarly to Content items --- .../Models/Mapping/MediaModelMapper.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs index 9cb680f204..3c27d0f183 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs @@ -84,6 +84,33 @@ namespace Umbraco.Web.Models.Mapping private static void AfterMap(IMedia media, MediaItemDisplay display, IDataTypeService dataTypeService) { + // Adapted from ContentModelMapper + //map the IsChildOfListView (this is actually if it is a descendant of a list view!) + //TODO: Fix this shorthand .Ancestors() lookup, at least have an overload to use the current + if (media.HasIdentity) + { + var ancesctorListView = media.Ancestors().FirstOrDefault(x => x.ContentType.IsContainer); + display.IsChildOfListView = ancesctorListView != null; + } + else + { + //it's new so it doesn't have a path, so we need to look this up by it's parent + ancestors + var parent = media.Parent(); + if (parent == null) + { + display.IsChildOfListView = false; + } + else if (parent.ContentType.IsContainer) + { + display.IsChildOfListView = true; + } + else + { + var ancesctorListView = parent.Ancestors().FirstOrDefault(x => x.ContentType.IsContainer); + display.IsChildOfListView = ancesctorListView != null; + } + } + //map the tree node url if (HttpContext.Current != null) { From f27a726a6e227a3169897fe41e867cb50397abe7 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Tue, 8 Dec 2015 21:19:41 +0000 Subject: [PATCH 12/27] Disabled the X-AspNetMvc-Version header --- src/Umbraco.Web/WebBootManager.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index baac1109e4..f84d204bb1 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -145,6 +145,8 @@ namespace Umbraco.Web }); ClientDependencySettings.Instance.MvcRendererCollection.Add(renderer); + // Disable the X-AspNetMvc-Version HTTP Header + MvcHandler.DisableMvcResponseHeader = true; InstallHelper insHelper = new InstallHelper(UmbracoContext.Current); insHelper.DeleteLegacyInstaller(); From 739ff33ce18e5e27c0824a9bf1f72cde56a87302 Mon Sep 17 00:00:00 2001 From: James Coxhead Date: Tue, 8 Dec 2015 21:44:40 +0000 Subject: [PATCH 13/27] Removed X-AspNet-Version and X-AspNetMvc-Version headers --- src/Umbraco.Web/UmbracoModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index a7c41ba90f..8e14975a93 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -490,6 +490,8 @@ namespace Umbraco.Web httpContext.Response.Headers.Remove("Server"); //this doesn't normally work since IIS sets it but we'll keep it here anyways. httpContext.Response.Headers.Remove("X-Powered-By"); + httpContext.Response.Headers.Remove("X-AspNet-Version"); + httpContext.Response.Headers.Remove("X-AspNetMvc-Version"); } catch (PlatformNotSupportedException ex) { From b3e21e08277be71d5fc8d40c93e312c9445bed9e Mon Sep 17 00:00:00 2001 From: Andrey Shchekin Date: Thu, 10 Dec 2015 14:33:52 +1300 Subject: [PATCH 14/27] U4-7522 Removed unnecessary exception from DeepCloneHelper. --- src/Umbraco.Core/Models/DeepCloneHelper.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Umbraco.Core/Models/DeepCloneHelper.cs b/src/Umbraco.Core/Models/DeepCloneHelper.cs index 0e0e260c06..e5163a0c49 100644 --- a/src/Umbraco.Core/Models/DeepCloneHelper.cs +++ b/src/Umbraco.Core/Models/DeepCloneHelper.cs @@ -79,6 +79,12 @@ namespace Umbraco.Core.Models else { //its a custom IEnumerable, we'll try to create it + if (propertyInfo.PropertyType.IsAbstract || propertyInfo.PropertyType.IsInterface) + { + //these will always produce an exception, skipping early + continue; + } + try { var custom = Activator.CreateInstance(propertyInfo.PropertyType); From ecb6c8e52cef50257b4821431f8edf77f852e7c3 Mon Sep 17 00:00:00 2001 From: Simon Busborg Date: Tue, 15 Dec 2015 10:08:19 +0100 Subject: [PATCH 15/27] Fix for U4-7373 Error notifications shown are hidden underneath the dialogs http://issues.umbraco.org/issue/U4-7373 --- .../application/navresize.directive.js | 6 +++- src/Umbraco.Web.UI.Client/src/index.html | 7 ++--- .../src/less/application/grid.less | 28 +++++++++++-------- .../notifications/umb-notifications.html | 2 +- .../umbraco/Views/Default.cshtml | 5 ++-- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js index ab683b490d..8fa08a78a2 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js @@ -31,6 +31,7 @@ angular.module("umbraco.directives") resize: function(e, ui) { var wrapper = $("#mainwrapper"); var contentPanel = $("#contentwrapper"); + var umbNotification = $("#umb-notifications-wrapper"); var apps = $("#applications"); var bottomBar = contentPanel.find(".umb-bottom-bar"); var navOffeset = $("#navOffset"); @@ -39,6 +40,7 @@ angular.module("umbraco.directives") contentPanel.css({ left: leftPanelWidth }); bottomBar.css({ left: leftPanelWidth }); + umbNotification.css({ left: leftPanelWidth }); navOffeset.css({ "margin-left": ui.element.outerWidth() }); }, @@ -55,11 +57,13 @@ angular.module("umbraco.directives") if (resizeEnabled) { //kill the resize element.resizable("destroy"); - element.css("width", ""); + var navInnerContainer = element.find(".navigation-inner-container"); + navInnerContainer.css("width", ""); $("#contentwrapper").css("left", ""); + $("#umb-notification").css("left" ""); $("#navOffset").css("margin-left", ""); resizeEnabled = false; diff --git a/src/Umbraco.Web.UI.Client/src/index.html b/src/Umbraco.Web.UI.Client/src/index.html index 362510e044..50d78c315b 100644 --- a/src/Umbraco.Web.UI.Client/src/index.html +++ b/src/Umbraco.Web.UI.Client/src/index.html @@ -9,18 +9,17 @@ - +
-
-
+
- + diff --git a/src/Umbraco.Web.UI.Client/src/less/application/grid.less b/src/Umbraco.Web.UI.Client/src/less/application/grid.less index a33dbb56a3..a169e2d40e 100644 --- a/src/Umbraco.Web.UI.Client/src/less/application/grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/application/grid.less @@ -47,6 +47,10 @@ body { margin: 0 } +#umb-notifications-wrapper { + left: 80px; +} + #contentcolumn { left: 0px; } @@ -168,12 +172,12 @@ body { border-radius: 0; } -.ui-resizable-e { - cursor: e-resize; - width: 4px; - right: -5px; - top: 0; - bottom: 0; +.ui-resizable-e { + cursor: e-resize; + width: 4px; + right: -5px; + top: 0; + bottom: 0; background-color: @grayLighter; border: solid 1px @grayLight; position:absolute; @@ -182,12 +186,12 @@ body { } @media (min-width: 1101px) { - #contentwrapper {left: 440px;} + #contentwrapper, #umb-notifications-wrapper {left: 440px;} #speechbubble {left: 360px;} } //empty section modification -.emptySection #contentwrapper {left: 80px;} +.emptySection #contentwrapper, .emptySection #umb-notifications-wrapper {left: 80px;} .emptySection #speechbubble {left: 0;} .emptySection #navigation {display: none} @@ -202,7 +206,7 @@ body { @media (max-width: 767px) { - + // make leftcolumn smaller on tablets #leftcolumn { width: 60px; @@ -219,7 +223,7 @@ body { #navigation { left: 60px; } - #contentwrapper, #contentcolumn { + #contentwrapper, #contentcolumn, #umb-notifications-wrapper { left: 30px; } #umbracoMainPageBody .umb-modal-left.fade.in { @@ -230,7 +234,7 @@ body { @media (max-width: 500px) { - + // make leftcolumn smaller on mobiles #leftcolumn { width: 40px; @@ -259,7 +263,7 @@ body { #navigation { left: 40px; } - #contentwrapper, #contentcolumn { + #contentwrapper, #contentcolumn, #umb-notifications-wrapper { left: 20px; } #umbracoMainPageBody .umb-modal-left.fade.in { diff --git a/src/Umbraco.Web.UI.Client/src/views/components/notifications/umb-notifications.html b/src/Umbraco.Web.UI.Client/src/views/components/notifications/umb-notifications.html index 169a197999..9962e2dd84 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/notifications/umb-notifications.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/notifications/umb-notifications.html @@ -1,4 +1,4 @@ -
+
  • -
    +
    -
    + +
    @Html.BareMinimumServerVariablesScript(Url, Url.Action("ExternalLogin", "BackOffice", new { area = ViewBag.UmbracoPath })) From d75f8bf1bd7af3b01ff95b151eabc921a44475c2 Mon Sep 17 00:00:00 2001 From: Simon Busborg Date: Tue, 15 Dec 2015 10:24:38 +0100 Subject: [PATCH 16/27] added wrapper to directive --- .../directives/components/application/navresize.directive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js index 8fa08a78a2..9f008528bf 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js @@ -63,7 +63,7 @@ angular.module("umbraco.directives") navInnerContainer.css("width", ""); $("#contentwrapper").css("left", ""); - $("#umb-notification").css("left" ""); + $("#umb-notifications-wrapper").css("left" ""); $("#navOffset").css("margin-left", ""); resizeEnabled = false; From 31147fa8d1b16633fe7749496377170f2186002b Mon Sep 17 00:00:00 2001 From: Simon Busborg Date: Tue, 15 Dec 2015 10:26:22 +0100 Subject: [PATCH 17/27] missing comma --- .../directives/components/application/navresize.directive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js index 9f008528bf..8addd6faf6 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/navresize.directive.js @@ -63,7 +63,7 @@ angular.module("umbraco.directives") navInnerContainer.css("width", ""); $("#contentwrapper").css("left", ""); - $("#umb-notifications-wrapper").css("left" ""); + $("#umb-notifications-wrapper").css("left", ""); $("#navOffset").css("margin-left", ""); resizeEnabled = false; From 8598ab565cd056a230dd4bbada568f5fae32e0ed Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 15 Dec 2015 10:34:11 +0100 Subject: [PATCH 18/27] Fixes: U4-7536 Sign-out in back office will call all ASP.Net identity middleware sign out methods publicises a few things too. --- src/Umbraco.Core/Constants-Conventions.cs | 2 +- src/Umbraco.Core/Security/AuthenticationExtensions.cs | 4 +++- src/Umbraco.Web/Editors/AuthenticationController.cs | 6 ++++-- src/Umbraco.Web/IUmbracoContextAccessor.cs | 7 ++----- src/Umbraco.Web/Security/WebSecurity.cs | 6 ++++-- .../WebApi/Filters/UmbracoBackOfficeLogoutAttribute.cs | 4 +++- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs index 3456ff1cfa..7e2bb88964 100644 --- a/src/Umbraco.Core/Constants-Conventions.cs +++ b/src/Umbraco.Core/Constants-Conventions.cs @@ -206,7 +206,7 @@ namespace Umbraco.Core ///
internal const string StandardPropertiesGroupName = "Membership"; - internal static Dictionary GetStandardPropertyTypeStubs() + public static Dictionary GetStandardPropertyTypeStubs() { return new Dictionary { diff --git a/src/Umbraco.Core/Security/AuthenticationExtensions.cs b/src/Umbraco.Core/Security/AuthenticationExtensions.cs index 1c7c544ed8..79fdc1bed1 100644 --- a/src/Umbraco.Core/Security/AuthenticationExtensions.cs +++ b/src/Umbraco.Core/Security/AuthenticationExtensions.cs @@ -357,7 +357,9 @@ namespace Umbraco.Core.Security { //TODO: Do we need to do more here?? need to make sure that the forms cookie is gone, but is that // taken care of in our custom middleware somehow? - ctx.Authentication.SignOut(); + ctx.Authentication.SignOut( + Core.Constants.Security.BackOfficeAuthenticationType, + Core.Constants.Security.BackOfficeExternalAuthenticationType); return null; } } diff --git a/src/Umbraco.Web/Editors/AuthenticationController.cs b/src/Umbraco.Web/Editors/AuthenticationController.cs index 25b60c5cb7..ca6a69e238 100644 --- a/src/Umbraco.Web/Editors/AuthenticationController.cs +++ b/src/Umbraco.Web/Editors/AuthenticationController.cs @@ -97,7 +97,7 @@ namespace Umbraco.Web.Editors if (result.Succeeded) { var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); - await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); + await SignInManager.SignInAsync(user, isPersistent: true, rememberBrowser: false); return Request.CreateResponse(HttpStatusCode.OK); } else @@ -240,7 +240,9 @@ namespace Umbraco.Web.Editors [ValidateAngularAntiForgeryToken] public HttpResponseMessage PostLogout() { - Request.TryGetOwinContext().Result.Authentication.SignOut(); + Request.TryGetOwinContext().Result.Authentication.SignOut( + Core.Constants.Security.BackOfficeAuthenticationType, + Core.Constants.Security.BackOfficeExternalAuthenticationType); Logger.Info("User {0} from IP address {1} has logged out", () => User.Identity == null ? "UNKNOWN" : User.Identity.Name, diff --git a/src/Umbraco.Web/IUmbracoContextAccessor.cs b/src/Umbraco.Web/IUmbracoContextAccessor.cs index e3614a1e86..997b25145b 100644 --- a/src/Umbraco.Web/IUmbracoContextAccessor.cs +++ b/src/Umbraco.Web/IUmbracoContextAccessor.cs @@ -2,11 +2,8 @@ namespace Umbraco.Web { /// /// Used to retrieve the Umbraco context - /// - /// - /// TODO: We could expose this to make working with UmbracoContext easier if we were to use it throughout the codebase - /// - internal interface IUmbracoContextAccessor + /// + public interface IUmbracoContextAccessor { UmbracoContext Value { get; } } diff --git a/src/Umbraco.Web/Security/WebSecurity.cs b/src/Umbraco.Web/Security/WebSecurity.cs index af6e53ca11..4ace3b236b 100644 --- a/src/Umbraco.Web/Security/WebSecurity.cs +++ b/src/Umbraco.Web/Security/WebSecurity.cs @@ -131,7 +131,7 @@ namespace Umbraco.Web.Security var userData = Mapper.Map(user); _httpContext.SetPrincipalForRequest(userData); - SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false).Wait(); + SignInManager.SignInAsync(user, isPersistent: true, rememberBrowser: false).Wait(); return TimeSpan.FromMinutes(GlobalSettings.TimeOutInMinutes).TotalSeconds; } @@ -162,7 +162,9 @@ namespace Umbraco.Web.Security public virtual void ClearCurrentLogin() { _httpContext.UmbracoLogout(); - _httpContext.GetOwinContext().Authentication.SignOut(); + _httpContext.GetOwinContext().Authentication.SignOut( + Core.Constants.Security.BackOfficeAuthenticationType, + Core.Constants.Security.BackOfficeExternalAuthenticationType); } /// diff --git a/src/Umbraco.Web/WebApi/Filters/UmbracoBackOfficeLogoutAttribute.cs b/src/Umbraco.Web/WebApi/Filters/UmbracoBackOfficeLogoutAttribute.cs index 29ed4da73e..8912ca68ca 100644 --- a/src/Umbraco.Web/WebApi/Filters/UmbracoBackOfficeLogoutAttribute.cs +++ b/src/Umbraco.Web/WebApi/Filters/UmbracoBackOfficeLogoutAttribute.cs @@ -19,7 +19,9 @@ namespace Umbraco.Web.WebApi.Filters //this calls the underlying owin sign out logic - which should call the // auth providers middleware callbacks if using custom auth middleware - context.Request.TryGetOwinContext().Result.Authentication.SignOut(); + context.Request.TryGetOwinContext().Result.Authentication.SignOut( + Core.Constants.Security.BackOfficeAuthenticationType, + Core.Constants.Security.BackOfficeExternalAuthenticationType); } } } \ No newline at end of file From 44ebd8d9ea781fb46fa8b7de87e9470659b1c2dd Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 15 Dec 2015 12:18:23 +0100 Subject: [PATCH 19/27] Proper formatting of this file, only whitespace changes --- src/Umbraco.Web/umbraco.presentation/macro.cs | 268 +++++++++--------- 1 file changed, 134 insertions(+), 134 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/macro.cs b/src/Umbraco.Web/umbraco.presentation/macro.cs index b1b18b07d5..a5ed603529 100644 --- a/src/Umbraco.Web/umbraco.presentation/macro.cs +++ b/src/Umbraco.Web/umbraco.presentation/macro.cs @@ -63,7 +63,7 @@ namespace umbraco private readonly StringBuilder _content = new StringBuilder(); private const string MacrosAddedKey = "macrosAdded"; public IList Exceptions = new List(); - + protected static ISqlHelper SqlHelper { get { return Application.SqlHelper; } @@ -158,7 +158,7 @@ namespace umbraco public macro(string alias) { Macro m = Macro.GetByAlias(alias); - Model = new MacroModel(m); + Model = new MacroModel(m); } public MacroModel Model { get; set; } @@ -169,7 +169,7 @@ namespace umbraco } public static macro GetMacro(int id) - { + { return new macro(id); } @@ -200,9 +200,9 @@ namespace umbraco { if (this.Model != null) { - DistributedCache.Instance.RemoveMacroCache(this); + DistributedCache.Instance.RemoveMacroCache(this); } - + //this always returned false... hrm. oh well i guess we leave it like that return false; } @@ -254,7 +254,7 @@ namespace umbraco /// An event that is raised just before the macro is rendered allowing developers to modify the macro before it executes. /// public static event TypedEventHandler MacroRendering; - + /// /// Raises the MacroRendering event /// @@ -282,7 +282,7 @@ namespace umbraco using (DisposableTimer.DebugDuration(macroInfo)) { - TraceInfo("renderMacro", macroInfo, excludeProfiling:true); + TraceInfo("renderMacro", macroInfo, excludeProfiling: true); StateHelper.SetContextValue(MacrosAddedKey, StateHelper.GetContextValue(MacrosAddedKey) + 1); @@ -302,12 +302,12 @@ namespace umbraco { var renderFailed = false; var macroType = Model.MacroType != MacroTypes.Unknown - ? (int) Model.MacroType + ? (int)Model.MacroType : MacroType; switch (macroType) { - case (int) MacroTypes.PartialView: + case (int)MacroTypes.PartialView: //error handler for partial views, is an action because we need to re-use it twice below Func handleError = e => @@ -324,7 +324,7 @@ namespace umbraco Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - var errorMessage = ApplicationContext.Current.Services.TextService.Localize("errors/macroErrorLoadingPartialView",new[]{ScriptFile}); + var errorMessage = ApplicationContext.Current.Services.TextService.Localize("errors/macroErrorLoadingPartialView", new[] { ScriptFile }); if (errorMessage.Equals("[macroErrorLoadingPartialView]")) // This check can be removed when key is added to every language file { errorMessage = "Error loading Partial View script (file: " + ScriptFile + ")"; @@ -334,7 +334,7 @@ namespace umbraco using (DisposableTimer.DebugDuration("Executing Partial View: " + Model.TypeName)) { - TraceInfo("umbracoMacro", "Partial View added (" + Model.TypeName + ")", excludeProfiling:true); + TraceInfo("umbracoMacro", "Partial View added (" + Model.TypeName + ")", excludeProfiling: true); try { var result = LoadPartialViewMacro(Model); @@ -369,13 +369,13 @@ namespace umbraco break; } - case (int) MacroTypes.UserControl: + case (int)MacroTypes.UserControl: using (DisposableTimer.DebugDuration("Executing UserControl: " + Model.TypeName)) { try { - TraceInfo("umbracoMacro", "Usercontrol added (" + Model.TypeName + ")", excludeProfiling:true); + TraceInfo("umbracoMacro", "Usercontrol added (" + Model.TypeName + ")", excludeProfiling: true); // Add tilde for v4 defined macros if (string.IsNullOrEmpty(Model.TypeName) == false && @@ -412,8 +412,8 @@ namespace umbraco break; } } - - case (int) MacroTypes.CustomControl: + + case (int)MacroTypes.CustomControl: using (DisposableTimer.DebugDuration("Executing CustomControl: " + Model.TypeName + "." + Model.TypeAssembly)) { @@ -453,10 +453,10 @@ namespace umbraco break; } } - case (int) MacroTypes.XSLT: + case (int)MacroTypes.XSLT: macroControl = LoadMacroXslt(this, Model, pageElements, true); - break; - case (int) MacroTypes.Script: + break; + case (int)MacroTypes.Script: //error handler for partial views, is an action because we need to re-use it twice below Func handleMacroScriptError = e => @@ -512,7 +512,7 @@ namespace umbraco break; } } - case (int) MacroTypes.Unknown: + case (int)MacroTypes.Unknown: default: if (GlobalSettings.DebugMode) { @@ -608,9 +608,9 @@ namespace umbraco CacheItemPriority.NotRemovable, new TimeSpan(0, 0, Model.CacheDuration), () => DateTime.Now); - + } - + } } } @@ -752,7 +752,7 @@ namespace umbraco switch (model.MacroType) { case MacroTypes.XSLT: - return string.Concat("~/xslt/", model.Xslt); + return string.Concat("~/xslt/", model.Xslt); case MacroTypes.Python: case MacroTypes.Script: return string.Concat("~/macroScripts/", model.ScriptName); @@ -760,7 +760,7 @@ namespace umbraco return model.ScriptName; //partial views are saved with the full virtual path case MacroTypes.UserControl: return model.TypeName; //user controls saved with the full virtual path - case MacroTypes.CustomControl: + case MacroTypes.CustomControl: case MacroTypes.Unknown: default: return "/" + model.TypeName; @@ -784,7 +784,7 @@ namespace umbraco { switch (model.MacroType) { - case MacroTypes.XSLT: + case MacroTypes.XSLT: case MacroTypes.Python: case MacroTypes.Script: case MacroTypes.PartialView: @@ -805,12 +805,12 @@ namespace umbraco CacheItemPriority.Default, new CacheDependency(IOHelper.MapPath(SystemDirectories.Xslt + "/" + XsltFile)), () => + { + using (var xslReader = new XmlTextReader(IOHelper.MapPath(SystemDirectories.Xslt.EnsureEndsWith('/') + XsltFile))) { - using (var xslReader = new XmlTextReader(IOHelper.MapPath(SystemDirectories.Xslt.EnsureEndsWith('/') + XsltFile))) - { - return CreateXsltTransform(xslReader, GlobalSettings.DebugMode); - } - }); + return CreateXsltTransform(xslReader, GlobalSettings.DebugMode); + } + }); } public void UpdateMacroModel(Hashtable attributes) @@ -891,7 +891,7 @@ namespace umbraco if (!canNavigate) { - // get master xml document + // get master xml document var cache = UmbracoContext.Current.ContentCache.InnerCache as Umbraco.Web.PublishedCache.XmlPublishedCache.PublishedContentCache; if (cache == null) throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported."); XmlDocument umbracoXml = cache.GetXml(UmbracoContext.Current, UmbracoContext.Current.InPreviewMode); @@ -932,9 +932,9 @@ namespace umbraco { try { - var transformed = canNavigate - ? GetXsltTransformResult(macroNavigator, contentNavigator, xsltFile) // better? - : GetXsltTransformResult(macroXml, xsltFile); // document + var transformed = canNavigate + ? GetXsltTransformResult(macroNavigator, contentNavigator, xsltFile) // better? + : GetXsltTransformResult(macroXml, xsltFile); // document var result = CreateControlsFromText(transformed); return result; @@ -943,7 +943,7 @@ namespace umbraco { Exceptions.Add(e); LogHelper.WarnWithException("Error parsing XSLT file", e); - + var macroErrorEventArgs = new MacroErrorEventArgs { Name = Model.Name, Alias = Model.Alias, ItemKey = Model.Xslt, Exception = e, Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; var macroControl = GetControlForErrorBehavior("Error parsing XSLT file: \\xslt\\" + XsltFile, macroErrorEventArgs); //if it is null, then we are supposed to throw the (original) exception @@ -953,8 +953,8 @@ namespace umbraco throw; } return macroControl; - } - } + } + } } catch (Exception e) { @@ -972,7 +972,7 @@ namespace umbraco } return macroControl; } - } + } } // gets the control for the macro, using GetXsltTransform methods for execution @@ -1053,12 +1053,12 @@ namespace umbraco XsltArgumentList xslArgs; using (DisposableTimer.DebugDuration("Adding XSLT Extensions")) - { + { xslArgs = AddXsltExtensions(); var lib = new library(); xslArgs.AddExtensionObject("urn:umbraco.library", lib); } - + // Add parameters if (parameters == null || !parameters.ContainsKey("currentPage")) { @@ -1074,8 +1074,8 @@ namespace umbraco using (DisposableTimer.DebugDuration("Executing XSLT transform")) { xslt.Transform(macroXml.CreateNavigator(), xslArgs, tw); - } - return TemplateUtilities.ResolveUrlsFromTextString(tw.ToString()); + } + return TemplateUtilities.ResolveUrlsFromTextString(tw.ToString()); } // gets the result of the xslt transform with no parameters - Navigator mode @@ -1135,7 +1135,7 @@ namespace umbraco return XsltExtensionsResolver.Current.XsltExtensions .ToDictionary(x => x.Namespace, x => x.ExtensionObject); } - + /// /// Returns an XSLT argument list with all XSLT extensions added, /// both predefined and configured ones. @@ -1149,9 +1149,9 @@ namespace umbraco { string extensionNamespace = "urn:" + extension.Key; xslArgs.AddExtensionObject(extensionNamespace, extension.Value); - TraceInfo("umbracoXsltExtension", - String.Format("Extension added: {0}, {1}", - extensionNamespace, extension.Value.GetType().Name)); + TraceInfo("umbracoXsltExtension", + String.Format("Extension added: {0}, {1}", + extensionNamespace, extension.Value.GetType().Name)); } return xslArgs; @@ -1169,12 +1169,12 @@ namespace umbraco // if no value is passed, then use the current "pageID" as value var contentId = macroPropertyValue == string.Empty ? UmbracoContext.Current.PageId.ToString() : macroPropertyValue; - TraceInfo("umbracoMacro", - "Xslt node adding search start (" + macroPropertyAlias + ",'" + - macroPropertyValue + "')"); - + TraceInfo("umbracoMacro", + "Xslt node adding search start (" + macroPropertyAlias + ",'" + + macroPropertyValue + "')"); + //TODO: WE need to fix this so that we give control of this stuff over to the actual parameter editors! - + switch (macroPropertyType) { case "contentTree": @@ -1204,7 +1204,7 @@ namespace umbraco macroXmlNode.AppendChild(currentNode); - break; + break; case "contentAll": macroXmlNode.AppendChild(macroXml.ImportNode(umbracoXml.DocumentElement, true)); @@ -1212,33 +1212,33 @@ namespace umbraco case "contentRandom": XmlNode source = umbracoXml.GetElementById(contentId); - if (source != null) - { - var sourceList = source.SelectNodes("node|*[@isDoc]"); - if (sourceList.Count > 0) - { - int rndNumber; - var r = library.GetRandom(); - lock (r) - { - rndNumber = r.Next(sourceList.Count); - } - var node = macroXml.ImportNode(sourceList[rndNumber], true); - // remove all sub content nodes - foreach (XmlNode n in node.SelectNodes("node|*[@isDoc]")) - node.RemoveChild(n); + if (source != null) + { + var sourceList = source.SelectNodes("node|*[@isDoc]"); + if (sourceList.Count > 0) + { + int rndNumber; + var r = library.GetRandom(); + lock (r) + { + rndNumber = r.Next(sourceList.Count); + } + var node = macroXml.ImportNode(sourceList[rndNumber], true); + // remove all sub content nodes + foreach (XmlNode n in node.SelectNodes("node|*[@isDoc]")) + node.RemoveChild(n); - macroXmlNode.AppendChild(node); - } - else - TraceWarn("umbracoMacro", - "Error adding random node - parent (" + macroPropertyValue + - ") doesn't have children!"); - } - else - TraceWarn("umbracoMacro", - "Error adding random node - parent (" + macroPropertyValue + - ") doesn't exists!"); + macroXmlNode.AppendChild(node); + } + else + TraceWarn("umbracoMacro", + "Error adding random node - parent (" + macroPropertyValue + + ") doesn't have children!"); + } + else + TraceWarn("umbracoMacro", + "Error adding random node - parent (" + macroPropertyValue + + ") doesn't exists!"); break; case "mediaCurrent": @@ -1259,14 +1259,14 @@ namespace umbraco // add parameters to the macro parameters collection private void AddMacroParameter(ICollection parameters, NavigableNavigator contentNavigator, NavigableNavigator mediaNavigator, - string macroPropertyAlias,string macroPropertyType, string macroPropertyValue) + string macroPropertyAlias, string macroPropertyType, string macroPropertyValue) { // if no value is passed, then use the current "pageID" as value var contentId = macroPropertyValue == string.Empty ? UmbracoContext.Current.PageId.ToString() : macroPropertyValue; - TraceInfo("umbracoMacro", - "Xslt node adding search start (" + macroPropertyAlias + ",'" + - macroPropertyValue + "')"); + TraceInfo("umbracoMacro", + "Xslt node adding search start (" + macroPropertyAlias + ",'" + + macroPropertyValue + "')"); // beware! do not use the raw content- or media- navigators, but clones !! @@ -1322,15 +1322,15 @@ namespace umbraco if (node != null) { nav = contentNavigator.CloneWithNewRoot(node.Id.ToString(CultureInfo.InvariantCulture)); - parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, nav, 0)); + parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, nav, 0)); } else throw new InvalidOperationException("Iterator contains non-INavigableContent elements."); } else - TraceWarn("umbracoMacro", - "Error adding random node - parent (" + macroPropertyValue + - ") doesn't have children!"); + TraceWarn("umbracoMacro", + "Error adding random node - parent (" + macroPropertyValue + + ") doesn't have children!"); } else TraceWarn("umbracoMacro", @@ -1353,31 +1353,31 @@ namespace umbraco #endregion - /// - /// Renders a Partial View Macro - /// - /// - /// - internal ScriptingMacroResult LoadPartialViewMacro(MacroModel macro) - { - var retVal = new ScriptingMacroResult(); - IMacroEngine engine = null; - - engine = MacroEngineFactory.GetEngine(PartialViewMacroEngine.EngineName); - var ret = engine.Execute(macro, GetCurrentNode()); + /// + /// Renders a Partial View Macro + /// + /// + /// + internal ScriptingMacroResult LoadPartialViewMacro(MacroModel macro) + { + var retVal = new ScriptingMacroResult(); + IMacroEngine engine = null; - // if the macro engine supports success reporting and executing failed, then return an empty control so it's not cached - if (engine is IMacroEngineResultStatus) - { - var result = engine as IMacroEngineResultStatus; - if (!result.Success) - { - retVal.ResultException = result.ResultException; - } - } - retVal.Result = ret; - return retVal; - } + engine = MacroEngineFactory.GetEngine(PartialViewMacroEngine.EngineName); + var ret = engine.Execute(macro, GetCurrentNode()); + + // if the macro engine supports success reporting and executing failed, then return an empty control so it's not cached + if (engine is IMacroEngineResultStatus) + { + var result = engine as IMacroEngineResultStatus; + if (!result.Success) + { + retVal.ResultException = result.ResultException; + } + } + retVal.Result = ret; + return retVal; + } public ScriptingMacroResult loadMacroScript(MacroModel macro) { @@ -1410,7 +1410,7 @@ namespace umbraco retVal.Result = ret; return retVal; } - + /// /// Loads a custom or webcontrol using reflection into the macro object /// @@ -1439,8 +1439,8 @@ namespace umbraco if (!File.Exists(currentAss)) return new LiteralControl("Unable to load user control because is does not exist: " + fileName); asm = Assembly.LoadFrom(currentAss); - - TraceInfo("umbracoMacro", "Assembly file " + currentAss + " LOADED!!"); + + TraceInfo("umbracoMacro", "Assembly file " + currentAss + " LOADED!!"); } catch { @@ -1449,7 +1449,7 @@ namespace umbraco ".dll"))); } - TraceInfo("umbracoMacro", string.Format("Assembly Loaded from ({0}.dll)", fileName)); + TraceInfo("umbracoMacro", string.Format("Assembly Loaded from ({0}.dll)", fileName)); type = asm.GetType(controlName); if (type == null) return new LiteralControl(string.Format("Unable to get type {0} from assembly {1}", @@ -1477,8 +1477,8 @@ namespace umbraco { var prop = type.GetProperty(mp.Key); if (prop == null) - { - TraceWarn("macro", string.Format("control property '{0}' doesn't exist or aren't accessible (public)", mp.Key)); + { + TraceWarn("macro", string.Format("control property '{0}' doesn't exist or aren't accessible (public)", mp.Key)); continue; } @@ -1514,17 +1514,17 @@ namespace umbraco } } - /// - /// Loads an usercontrol using reflection into the macro object - /// - /// Filename of the usercontrol - ie. ~wulff.ascx - /// - /// The page elements. - /// - public Control loadUserControl(string fileName, MacroModel model, Hashtable pageElements) + /// + /// Loads an usercontrol using reflection into the macro object + /// + /// Filename of the usercontrol - ie. ~wulff.ascx + /// + /// The page elements. + /// + public Control loadUserControl(string fileName, MacroModel model, Hashtable pageElements) { - Mandate.ParameterNotNullOrEmpty(fileName, "fileName"); - Mandate.ParameterNotNull(model, "model"); + Mandate.ParameterNotNullOrEmpty(fileName, "fileName"); + Mandate.ParameterNotNull(model, "model"); try { @@ -1548,13 +1548,13 @@ namespace umbraco TraceInfo(LoadUserControlKey, string.Format("Usercontrol added with id '{0}'", oControl.ID)); - AddCurrentNodeToControl(oControl); + AddCurrentNodeToControl(oControl); UpdateControlProperties(oControl, model); return oControl; } catch (Exception e) { - LogHelper.WarnWithException(string.Format("Error creating usercontrol ({0})", fileName), true, e); + LogHelper.WarnWithException(string.Format("Error creating usercontrol ({0})", fileName), true, e); throw; } } @@ -1594,7 +1594,7 @@ namespace umbraco private static void TraceWarn(string category, string message, bool excludeProfiling = false) { if (HttpContext.Current != null) - HttpContext.Current.Trace.Warn(category, message); + HttpContext.Current.Trace.Warn(category, message); //Trace out to profiling... doesn't actually profile, just for informational output. if (excludeProfiling == false) @@ -1606,9 +1606,9 @@ namespace umbraco } private static void TraceWarn(string category, string message, Exception ex, bool excludeProfiling = false) - { - if (HttpContext.Current != null) - HttpContext.Current.Trace.Warn(category, message, ex); + { + if (HttpContext.Current != null) + HttpContext.Current.Trace.Warn(category, message, ex); //Trace out to profiling... doesn't actually profile, just for informational output. if (excludeProfiling == false) @@ -1617,7 +1617,7 @@ namespace umbraco { } } - } + } public static string renderMacroStartTag(Hashtable attributes, int pageId, Guid versionId) { @@ -1685,7 +1685,7 @@ namespace umbraco { return "Cannot render macro content in the rich text editor when the application is running in a Partial Trust environment"; } - + string tempAlias = (attributes["macroalias"] != null) ? attributes["macroalias"].ToString() : attributes["macroAlias"].ToString(); @@ -1875,7 +1875,7 @@ namespace umbraco var pageId = UmbracoContext.Current.PageId; content = pageId.HasValue ? UmbracoContext.Current.ContentCache.GetById(pageId.Value) : null; } - + return content == null ? null : LegacyNodeHelper.ConvertToNode(content); } From d069da8a4ff27538cf61059bed96bbbbdd6d40ca Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 15 Dec 2015 12:51:03 +0100 Subject: [PATCH 20/27] Make LocalizedTextService fall back to en-GB if the key is not found in the current file --- .../Services/LocalizedTextService.cs | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Core/Services/LocalizedTextService.cs b/src/Umbraco.Core/Services/LocalizedTextService.cs index cc789434f8..1e8d170b89 100644 --- a/src/Umbraco.Core/Services/LocalizedTextService.cs +++ b/src/Umbraco.Core/Services/LocalizedTextService.cs @@ -254,23 +254,35 @@ namespace Umbraco.Core.Services return "[" + key + "]"; } - var cultureSource = xmlSource[culture].Value; - - var xpath = area.IsNullOrWhiteSpace() - ? string.Format("//key [@alias = '{0}']", key) - : string.Format("//area [@alias = '{0}']/key [@alias = '{1}']", area, key); - - var found = cultureSource.XPathSelectElement(xpath); + var found = FindTranslation(xmlSource, culture, area, key); if (found != null) { return ParseTokens(found.Value, tokens); } + + // Fall back to English by default if we can't find the key + found = FindTranslation(xmlSource, new CultureInfo("en-GB"), area, key); + if (found != null) + return ParseTokens(found.Value, tokens); - //NOTE: Based on how legacy works, the default text does not contain the area, just the key + // If it can't be found in either file, fall back to the default, showing just the key in square brackets + // NOTE: Based on how legacy works, the default text does not contain the area, just the key return "[" + key + "]"; } + private XElement FindTranslation(IDictionary> xmlSource, CultureInfo culture, string area, string key) + { + var cultureSource = xmlSource[culture].Value; + + var xpath = area.IsNullOrWhiteSpace() + ? string.Format("//key [@alias = '{0}']", key) + : string.Format("//area [@alias = '{0}']/key [@alias = '{1}']", area, key); + + var found = cultureSource.XPathSelectElement(xpath); + return found; + } + /// /// Parses the tokens in the value /// From 80f597a7eb0e8bf5d773536665ac38b5dd39bbfe Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 15 Dec 2015 12:51:45 +0100 Subject: [PATCH 21/27] U4-7424 - Also update all other errors displayed in the frontend --- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 5 ++++ .../umbraco/config/lang/en_us.xml | 5 ++++ src/Umbraco.Web/umbraco.presentation/macro.cs | 26 +++++++++++-------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 7ffa57eaec..7c89e7f746 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -302,6 +302,11 @@ Please fill both alias and name on the new property type! There is a problem with read/write access to a specific file or folder Error loading Partial View script (file: %0%) + Error loading userControl '%0%' + Error loading customControl (Assembly: %0%, Type: '%1%') + Error loading MacroEngine script (file: %0%) + "Error parsing XSLT file: %0% + "Error reading XSLT file: %0% Please enter a title Please choose a type You're about to make the picture larger than the original size. Are you sure that you want to proceed? diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index b5a686eec1..2a86fa458b 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -303,6 +303,11 @@ Please fill both alias and name on the new property type! There is a problem with read/write access to a specific file or folder Error loading Partial View script (file: %0%) + Error loading userControl '%0%' + Error loading customControl (Assembly: %0%, Type: '%1%') + Error loading MacroEngine script (file: %0%) + "Error parsing XSLT file: %0% + "Error reading XSLT file: %0% Please enter a title Please choose a type You're about to make the picture larger than the original size. Are you sure that you want to proceed? diff --git a/src/Umbraco.Web/umbraco.presentation/macro.cs b/src/Umbraco.Web/umbraco.presentation/macro.cs index a5ed603529..e14cef4eb1 100644 --- a/src/Umbraco.Web/umbraco.presentation/macro.cs +++ b/src/Umbraco.Web/umbraco.presentation/macro.cs @@ -304,6 +304,7 @@ namespace umbraco var macroType = Model.MacroType != MacroTypes.Unknown ? (int)Model.MacroType : MacroType; + var textService = ApplicationContext.Current.Services.TextService; switch (macroType) { @@ -324,11 +325,7 @@ namespace umbraco Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - var errorMessage = ApplicationContext.Current.Services.TextService.Localize("errors/macroErrorLoadingPartialView", new[] { ScriptFile }); - if (errorMessage.Equals("[macroErrorLoadingPartialView]")) // This check can be removed when key is added to every language file - { - errorMessage = "Error loading Partial View script (file: " + ScriptFile + ")"; - } + var errorMessage = textService.Localize("errors/macroErrorLoadingPartialView", new[] { ScriptFile }); return GetControlForErrorBehavior(errorMessage, macroErrorEventArgs); }; @@ -401,7 +398,8 @@ namespace umbraco Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - macroControl = GetControlForErrorBehavior("Error loading userControl '" + Model.TypeName + "'", macroErrorEventArgs); + var errorMessage = textService.Localize("errors/macroErrorLoadingUsercontrol", new[] { Model.TypeName }); + macroControl = GetControlForErrorBehavior(errorMessage, macroErrorEventArgs); //if it is null, then we are supposed to throw the (original) exception // see: http://issues.umbraco.org/issue/U4-497 at the end if (macroControl == null) @@ -442,7 +440,8 @@ namespace umbraco Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - macroControl = GetControlForErrorBehavior("Error loading customControl (Assembly: " + Model.TypeAssembly + ", Type: '" + Model.TypeName + "'", macroErrorEventArgs); + var errorMessage = textService.Localize("errors/macroErrorLoadingCustomControl", new[] { Model.TypeAssembly, Model.TypeName }); + macroControl = GetControlForErrorBehavior(errorMessage, macroErrorEventArgs); //if it is null, then we are supposed to throw the (original) exception // see: http://issues.umbraco.org/issue/U4-497 at the end if (macroControl == null) @@ -474,7 +473,8 @@ namespace umbraco Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - return GetControlForErrorBehavior("Error loading MacroEngine script (file: " + ScriptFile + ")", macroErrorEventArgs); + var errorMessage = textService.Localize("errors/macroErrorLoadingMacroEngineScript", new[] { ScriptFile }); + return GetControlForErrorBehavior(errorMessage, macroErrorEventArgs); }; using (DisposableTimer.DebugDuration("Executing MacroEngineScript: " + ScriptFile)) @@ -923,7 +923,8 @@ namespace umbraco "

" + HttpContext.Current.Server.HtmlEncode(outerXml) + "

"); } - + + var textService = ApplicationContext.Current.Services.TextService; try { var xsltFile = getXslt(XsltFile); @@ -945,7 +946,9 @@ namespace umbraco LogHelper.WarnWithException("Error parsing XSLT file", e); var macroErrorEventArgs = new MacroErrorEventArgs { Name = Model.Name, Alias = Model.Alias, ItemKey = Model.Xslt, Exception = e, Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - var macroControl = GetControlForErrorBehavior("Error parsing XSLT file: \\xslt\\" + XsltFile, macroErrorEventArgs); + + var errorMessage = textService.Localize("errors/macroErrorParsingXSLTFile", new[] { XsltFile }); + var macroControl = GetControlForErrorBehavior(errorMessage, macroErrorEventArgs); //if it is null, then we are supposed to throw the (original) exception // see: http://issues.umbraco.org/issue/U4-497 at the end if (macroControl == null && throwError) @@ -963,7 +966,8 @@ namespace umbraco // Invoke any error handlers for this macro var macroErrorEventArgs = new MacroErrorEventArgs { Name = Model.Name, Alias = Model.Alias, ItemKey = Model.Xslt, Exception = e, Behaviour = UmbracoConfig.For.UmbracoSettings().Content.MacroErrorBehaviour }; - var macroControl = GetControlForErrorBehavior("Error reading XSLT file: \\xslt\\" + XsltFile, macroErrorEventArgs); + var errorMessage = textService.Localize("errors/macroErrorReadingXSLTFile", new[] { XsltFile }); + var macroControl = GetControlForErrorBehavior(errorMessage + XsltFile, macroErrorEventArgs); //if it is null, then we are supposed to throw the (original) exception // see: http://issues.umbraco.org/issue/U4-497 at the end if (macroControl == null && throwError) From eacc7f7fb3c987a5bcb15849988abeece56a6fe8 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 15 Dec 2015 13:50:19 +0100 Subject: [PATCH 22/27] Whoops, was supposed to be en-US by default --- src/Umbraco.Core/Services/LocalizedTextService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Services/LocalizedTextService.cs b/src/Umbraco.Core/Services/LocalizedTextService.cs index 1e8d170b89..886fa47cbf 100644 --- a/src/Umbraco.Core/Services/LocalizedTextService.cs +++ b/src/Umbraco.Core/Services/LocalizedTextService.cs @@ -262,7 +262,7 @@ namespace Umbraco.Core.Services } // Fall back to English by default if we can't find the key - found = FindTranslation(xmlSource, new CultureInfo("en-GB"), area, key); + found = FindTranslation(xmlSource, new CultureInfo("en-US"), area, key); if (found != null) return ParseTokens(found.Value, tokens); From 191f82aaaab647167c68aaa5694d8d0d88936d3c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 15 Dec 2015 14:34:13 +0100 Subject: [PATCH 23/27] Fixes: U4-7448 Grid - Sorting view --- .../less/components/buttons/umb-button.less | 2 +- .../src/less/components/umb-grid.less | 17 +++++++ .../propertyeditors/grid/grid.controller.js | 24 +++++++-- .../src/views/propertyeditors/grid/grid.html | 50 ++++++++++++++----- src/Umbraco.Web.UI/Umbraco/config/lang/cs.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/da.xml | 5 +- src/Umbraco.Web.UI/umbraco/config/lang/de.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 3 ++ .../umbraco/config/lang/en_us.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/es.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/fr.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/he.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/it.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/ja.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/ko.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/nl.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/no.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/pl.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/pt.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/ru.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/sv.xml | 3 ++ src/Umbraco.Web.UI/umbraco/config/lang/zh.xml | 3 ++ 22 files changed, 130 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less index 24c1e41a7a..d08864f5f7 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less @@ -3,7 +3,7 @@ overflow: hidden; } -.umb-button__button:active { + .umb-button__button:focus { outline: none; } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less index 7b11ca9338..19850478f6 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less @@ -175,6 +175,10 @@ } } +.umb-grid .umb-cell-content.-has-editors.-collapsed { + padding-top: 10px; +} + .umb-grid .cell-tools { @@ -289,6 +293,19 @@ margin-bottom: 10px; } +.umb-control-collapsed { + background-color: @grayLighter; + padding: 5px 10px; + border-width: 1px; + border-style: solid; + border-color: transparent; + cursor: move; +} + +.umb-control-collapsed:hover { + border-color: @blue; +} + .umb-grid .umb-control-click-overlay { position: absolute; width: 100%; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js index 464daa6b3e..aacfa778a9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js @@ -10,6 +10,8 @@ angular.module("umbraco") $scope.openRTEToolbarId = null; $scope.hasSettings = false; $scope.showRowConfigurations = true; + $scope.sortMode = false; + $scope.reorderKey = "general_reorder"; // ********************************************* // Sortable options @@ -80,7 +82,7 @@ angular.module("umbraco") distance: 10, cursor: "move", placeholder: "ui-sortable-placeholder", - handle: ".umb-control-bar", + handle: ".umb-control-handle", helper: "clone", connectWith: ".umb-cell-inner", forcePlaceholderSize: true, @@ -170,12 +172,17 @@ angular.module("umbraco") ui.item.context.style.display = "block"; ui.item.find(".mceNoEditor").each(function () { notIncludedRte = []; + var editors = _.findWhere(tinyMCE.editors, { id: $(this).attr("id") }); // save the dragged RTE settings - draggedRteSettings = _.findWhere(tinyMCE.editors, { id: $(this).attr("id") }).settings; + if(editors) { + draggedRteSettings = editors.settings; + + // remove the dragged RTE + tinyMCE.execCommand("mceRemoveEditor", false, $(this).attr("id")); + + } - // remove the dragged RTE - tinyMCE.execCommand("mceRemoveEditor", false, $(this).attr("id")); }); }, @@ -223,6 +230,15 @@ angular.module("umbraco") }; + $scope.toggleSortMode = function() { + $scope.sortMode = !$scope.sortMode; + if($scope.sortMode) { + $scope.reorderKey = "general_reorderDone"; + } else { + $scope.reorderKey = "general_reorder"; + } + }; + // ********************************************* // Add items overlay menu // ********************************************* diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html index 25e5450245..536576bcd9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html @@ -1,4 +1,19 @@ -
+
+ + + + + + + + + +
@@ -66,13 +81,13 @@
{{row.name}}
-
+
-
+
@@ -115,8 +130,10 @@
+ ng-class=" + {'-active': area.active, + '-has-editors': area.controls.length > 0, + '-collapsed': sortMode}">
@@ -130,11 +147,11 @@
-
+
-
+
@@ -144,7 +161,10 @@
-
+
+ + +
@@ -155,11 +175,15 @@ on-outside-click="clickOutsideControl($index, area.controls, area)" bind-click-on="{{control.active}}"> -
+
-
+
+ {{control.editor.name}} +
-
+
+ +
{{control.editor.name}} @@ -194,7 +218,7 @@ -
+
+
@@ -216,7 +240,7 @@ -
+
Ano Složka Výsledky hledání + Reorder + I am done reordering Background color @@ -823,6 +825,7 @@ Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml index 6baccf2680..5bc6d29ebc 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml @@ -405,6 +405,8 @@ Ja Mappe Søgeresultater + Reorder + I am done reordering Baggrundsfarve @@ -630,6 +632,7 @@ Mange hilsner fra Umbraco robotten Vælg layout Tilføj række Tilføj indhold + Slip indhold Instillinger tilføjet Indholdet er ikke tilladt her @@ -872,7 +875,7 @@ Mange hilsner fra Umbraco robotten Medlemstype Dokumenttyper Dokumenttyper - + Pakker Pakker Python diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml index 8e9bc9687c..06bb4068da 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml @@ -406,6 +406,8 @@ Ja Ordner Suchergebnisse + Reorder + I am done reordering Hintergrundfarbe @@ -819,6 +821,7 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Element hinzufügen Zeilenlayout auswählen Einfach auf <i class="icon icon-add blue"></i> klicken, um das erste Element anzulegen + Drop content Klicken, um Inhalt einzubetten Klicken, um Abbildung einzufügen Beschriftung ... diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index e4d7d8f4d6..1a2334846f 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -420,6 +420,8 @@ Yes Folder Search results + Reorder + I am done reordering Background colour @@ -880,6 +882,7 @@ To manage your website, simply open the Umbraco back office and start adding con Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index 7cd3b28b59..48774c0e87 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -420,6 +420,8 @@ Yes Folder Search results + Reorder + I am done reordering Background color @@ -880,6 +882,7 @@ To manage your website, simply open the Umbraco back office and start adding con Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml index 801be4fc7a..6c8a6501cb 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml @@ -407,6 +407,8 @@ Bienvenido... Ancho Si + Reorder + I am done reordering Color de fondo @@ -720,6 +722,7 @@ Choose layout Añade más filas Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml index 667e5dc30f..a56f7cd4d6 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml @@ -396,6 +396,8 @@ Oui Dossier Résultats de recherche + Reorder + I am done reordering Background color @@ -838,6 +840,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/he.xml b/src/Umbraco.Web.UI/umbraco/config/lang/he.xml index dbb17c9d58..a50b33b5cf 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/he.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/he.xml @@ -330,6 +330,8 @@ ברוכים הבאים... רוחב כן + Reorder + I am done reordering צבע רקע @@ -727,6 +729,7 @@ To manage your website, simply open the Umbraco back office and start adding con Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/it.xml b/src/Umbraco.Web.UI/umbraco/config/lang/it.xml index d1a2761221..89fca8e916 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/it.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/it.xml @@ -323,6 +323,8 @@ Benvenuto... Larghezza Si + Reorder + I am done reordering Colore di sfondo @@ -697,6 +699,7 @@ Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e i Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml index 2087a7cb35..efc279853d 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml @@ -410,6 +410,8 @@ はい フォルダー 検索結果 + Reorder + I am done reordering 背景色 @@ -870,6 +872,7 @@ Runwayをインストールして作られた新しいウェブサイトがど Choose a layout ここからレイアウトを選択します 最初の要素を追加します]]> + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml index 8d98f5cebd..6f5801157e 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml @@ -323,6 +323,8 @@ 환영합니다... 너비 + Reorder + I am done reordering 배경색 @@ -703,6 +705,7 @@ Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml index 6d0fdc3c80..fd4e6457a2 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml @@ -412,6 +412,8 @@ Breedte Ja Map + Reorder + I am done reordering Zoekresultaten @@ -810,6 +812,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Choose a layout Een rij aan de lay-out toevoegen teken onderaan en voeg je eerste item toe]]> + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml index bbd1edd4cc..f2b38abbe9 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/no.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/no.xml @@ -334,6 +334,8 @@ Bredde Ja Mappe + Reorder + I am done reordering Bakgrunnsfarge @@ -679,6 +681,7 @@ Vennlig hilsen Umbraco roboten Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml index a56138fd2f..8d67e2be40 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml @@ -321,6 +321,8 @@ Możesz dodać dodatkowe języki w menu "Języki" po lewej stronie.]]> Witaj... Szerokość Tak + Reorder + I am done reordering Kolor tła @@ -619,6 +621,7 @@ Miłego dnia!]]> Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml index 19d4e97a62..9a9276ba65 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml @@ -320,6 +320,8 @@ Bem Vindo(a)... Largura Sim + Reorder + I am done reordering Cor de fundo @@ -692,6 +694,7 @@ Você pode publicar esta página e todas suas sub-páginas ao selecionar pub Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml index 678a08659a..82f5e2f0a4 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml @@ -400,6 +400,8 @@ Добро пожаловать... Ширина Да + Reorder + I am done reordering Цвет фона @@ -410,6 +412,7 @@ Add content + Drop content Добавить шаблон сетки Настройте шаблон, задавая ширину колонок или добавляя дополнительные секции Добавить конфигурацию строки diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml index 0f1f4d8b21..4309e2e8bd 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml @@ -392,6 +392,8 @@ Bredd Titta på Ja + Reorder + I am done reordering Bakgrundsfärg @@ -732,6 +734,7 @@ Choose layout Lägg till rad Add content + Drop content Styles applied Indholdet er ikke tilladt her Indholdet er tilladt her diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml index 408d1c0194..72ff3e6a5e 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml @@ -363,6 +363,8 @@ 欢迎… + Reorder + I am done reordering 背景色 @@ -778,6 +780,7 @@ Choose a layout Add a row Add content + Drop content Settings applied This content is not allowed here From 3fa0f89dd18358ebf4bac85fff932f76a1d7772d Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 15 Dec 2015 14:42:48 +0100 Subject: [PATCH 24/27] U4-7134 New content type editor requires CRUD access to data types --- src/Umbraco.Web/Editors/DataTypeController.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web/Editors/DataTypeController.cs b/src/Umbraco.Web/Editors/DataTypeController.cs index f0554501b5..1336166c2c 100644 --- a/src/Umbraco.Web/Editors/DataTypeController.cs +++ b/src/Umbraco.Web/Editors/DataTypeController.cs @@ -27,11 +27,11 @@ namespace Umbraco.Web.Editors /// The API controller used for editing data types ///
/// - /// This controller is decorated with the UmbracoApplicationAuthorizeAttribute which means that any user requesting - /// access to ALL of the methods on this controller will need access to the developer application. + /// The security for this controller is defined to allow full CRUD access to data types if the user has access to either: + /// Content Types, Member Types or Media Types ... and of course to Data Types /// [PluginController("UmbracoApi")] - [UmbracoTreeAuthorize(Constants.Trees.DataTypes)] + [UmbracoTreeAuthorize(Constants.Trees.DataTypes, Constants.Trees.DocumentTypes, Constants.Trees.MediaTypes, Constants.Trees.MemberTypes)] [EnableOverrideAuthorization] public class DataTypeController : UmbracoAuthorizedJsonController { @@ -76,7 +76,7 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(HttpStatusCode.NotFound); } - Services.DataTypeService.Delete(foundType, UmbracoUser.Id); + Services.DataTypeService.Delete(foundType, Security.CurrentUser.Id); return Request.CreateResponse(HttpStatusCode.OK); } From c334f94d72f29f9f0f67a3886470e56149aeace7 Mon Sep 17 00:00:00 2001 From: Claus Date: Tue, 15 Dec 2015 14:47:19 +0100 Subject: [PATCH 25/27] Fixed a few comments. --- src/Umbraco.Core/Models/DeepCloneHelper.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Models/DeepCloneHelper.cs b/src/Umbraco.Core/Models/DeepCloneHelper.cs index e5163a0c49..7523555c24 100644 --- a/src/Umbraco.Core/Models/DeepCloneHelper.cs +++ b/src/Umbraco.Core/Models/DeepCloneHelper.cs @@ -78,13 +78,13 @@ namespace Umbraco.Core.Models } else { - //its a custom IEnumerable, we'll try to create it + //skip instead of trying to create instance of abstract or interface if (propertyInfo.PropertyType.IsAbstract || propertyInfo.PropertyType.IsInterface) { - //these will always produce an exception, skipping early continue; } - + + //its a custom IEnumerable, we'll try to create it try { var custom = Activator.CreateInstance(propertyInfo.PropertyType); From 9a8273b784beef480290aa5a696e6ccb449eab10 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 15 Dec 2015 14:51:51 +0100 Subject: [PATCH 26/27] Fixes: U4-7541 umbAutoResize does not work in Microsoft Edge --- .../directives/components/forms/umbautoresize.directive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbautoresize.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbautoresize.directive.js index 5ba8839d08..8a456670c3 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbautoresize.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbautoresize.directive.js @@ -19,7 +19,7 @@ angular.module("umbraco.directives") var ua = window.navigator.userAgent; var msie = ua.indexOf("MSIE "); - if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) { + if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./) || navigator.userAgent.match(/Edge\/\d+/)) { return true; } else { return false; From 727fd3aa17e0750d37d53edb7aa52b36497a3300 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 15 Dec 2015 15:12:22 +0100 Subject: [PATCH 27/27] U4-7537 File cleanup for old content type editor --- src/Umbraco.Core/Strings/Notes.txt | 40 - src/Umbraco.Core/Umbraco.Core.csproj | 3 - src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 22 - .../controls/ContentTypeControlNew.ascx | 240 --- .../controls/ContentTypeControlNew.ascx.cs | 59 - .../ContentTypeControlNew.ascx.designer.cs | 24 - .../GenericProperties/GenericProperty.ascx | 80 - .../umbraco/members/EditMemberType.aspx | 37 - .../umbraco/settings/EditMediaType.aspx | 15 - .../umbraco/settings/EditNodeTypeNew.aspx | 57 - .../umbraco/settings/EditNodeTypeNew.aspx.cs | 11 - .../settings/EditNodeTypeNew.aspx.designer.cs | 33 - .../umbraco_client/Editors/EditContentType.js | 108 - .../GenericProperty/genericProperty.js | 53 - .../GenericProperty/genericproperty.css | 107 - src/Umbraco.Web/Umbraco.Web.csproj | 30 - .../controls/ContentTypeControlNew.ascx.cs | 1879 ----------------- .../GenericProperties/GenericProperty.ascx.cs | 456 ---- .../GenericPropertyWrapper.cs | 131 -- .../umbraco/members/EditMemberType.aspx | 35 - .../umbraco/members/EditMemberType.aspx.cs | 142 -- .../members/EditMemberType.aspx.designer.cs | 34 - .../umbraco/settings/EditMediaType.aspx | 15 - .../umbraco/settings/EditMediaType.aspx.cs | 52 - .../settings/EditMediaType.aspx.designer.cs | 24 - .../umbraco/settings/EditNodeTypeNew.aspx.cs | 167 -- 26 files changed, 3854 deletions(-) delete mode 100644 src/Umbraco.Core/Strings/Notes.txt delete mode 100644 src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx delete mode 100644 src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.cs delete mode 100644 src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.designer.cs delete mode 100644 src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx delete mode 100644 src/Umbraco.Web.UI/umbraco/members/EditMemberType.aspx delete mode 100644 src/Umbraco.Web.UI/umbraco/settings/EditMediaType.aspx delete mode 100644 src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx delete mode 100644 src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.cs delete mode 100644 src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.designer.cs delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Editors/EditContentType.js delete mode 100644 src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericProperty.js delete mode 100644 src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericproperty.css delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericPropertyWrapper.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.designer.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.designer.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditNodeTypeNew.aspx.cs diff --git a/src/Umbraco.Core/Strings/Notes.txt b/src/Umbraco.Core/Strings/Notes.txt deleted file mode 100644 index b1f82636cd..0000000000 --- a/src/Umbraco.Core/Strings/Notes.txt +++ /dev/null @@ -1,40 +0,0 @@ -Two constants are defined in StringExtensions: -UmbracoValidAliasCharacters -UmbracoInvalidFirstCharacters - -They were used exclusively by umbraco/js/UmbracoCasingRules.aspx.cs to define some JavaScript variables -which in turn were used by genericProperty.js to provide validation for aliases. - -UmbracoCasingRules.aspx and genericProperty.js are used in: - Umbraco.Web\umbraco.presentation\umbraco\controls\ContentTypeControlNew.ascx - Umbraco.Web\umbraco.presentation\umbraco\controls\GenericProperties\GenericProperty.ascx - -genericProperty.js defined the following functions: - safeAlias(alias) : provides a safe alias version of alias - isValidAlias(alias) : whether an alias is safe - checkAlias(id) : plugs a safe alias validator / corrector on an element - duplicatePropertyNameAsSafeAlias(propertyId, aliasId) : creates the alias from the prop. name - -These are used to validate the alias of the content type, and of properties. No other alias in -Umbraco back-end seem to be validated in UI at that point. And, there seem to be no server-side -validation so the server just seems trust the UI. - -Whereas in theory, we should only accept that the casing required by the user is different -from what our "toSafeAlias" method would provide, anything else is a validation error. - -Legacy safe aliases accept leading and trailing dashes and underscores. - -REFACTOR - -Abstract string methods into IShortStringHelper, and create a new DefaultShortStringHelper which -re-implements methods in a clean nice way. The new aliases do not accepts dashes, nor leading -underscores. - -Entirely refactor StringExtensions to rely on IShortStringHelper (via a resolver). - -The constants in StringExtensions should go, but we keep them for backward compatility. -The legacy helper is 100% backward compatible even at JavaScript level, but the new helper -is NOT, it does server-side validation of aliases, all sorts of things, using an api service. - -UmbracoCasingRules.aspx.cs is _gone_ in all cases, replaced by the JavaScript served by -the api service. diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 997f57b0ca..fb00485640 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -1402,9 +1402,6 @@ umbraco.interfaces - - - ResXFileCodeGenerator diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index c000bf51d1..03f50a4e65 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -363,13 +363,6 @@ True Settings.settings - - ContentTypeControlNew.ascx - ASPXCodeBehind - - - ContentTypeControlNew.ascx - ImageViewer.ascx ASPXCodeBehind @@ -530,13 +523,6 @@ QuickSearch.ascx - - EditNodeTypeNew.aspx - ASPXCodeBehind - - - EditNodeTypeNew.aspx - ASPXCodeBehind @@ -596,7 +582,6 @@ - umbraco.aspx @@ -1652,8 +1637,6 @@ - - @@ -2022,7 +2005,6 @@ UserControl - @@ -2231,7 +2213,6 @@ - @@ -2243,12 +2224,9 @@ Form - - - diff --git a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx b/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx deleted file mode 100644 index 21230a343d..0000000000 --- a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx +++ /dev/null @@ -1,240 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="True" Codebehind="ContentTypeControlNew.ascx.cs" - Inherits="Umbraco.Web.UI.Umbraco.Controls.ContentTypeControlNew" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> -<%@ Import Namespace="umbraco" %> -<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> -<%@ Register TagPrefix="cc2" Namespace="umbraco.uicontrols" Assembly="controls" %> -<%@ Register TagPrefix="cdf" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> - - - - - - - - - - -

<%=ui.GetText("settings", "contentTypeEnabled")%>
<%=umbraco.ui.GetText("settings", "contentTypeUses")%> <%=umbraco.ui.GetText("settings", "asAContentMasterType")%>

-
- - - -   - - - - - - - - - - - - - - - - - -

-

-
-
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
-
- - - - - <%if (cb_isContainer.Checked) { %> - -
- -
-
-
-
- - -
- - -  (<%=ui.Text("general", "default", Security.CurrentUser) %>) - -
- - <%=ui.Text("general", "edit", Security.CurrentUser) %> - -
- -
- - -
- -
-
-
- -
-
- - <%--Scripting to for configuring a list view--%> - - - <%} %> - -
- -
- - - - - - - - - - - - - - -
- - - - -

Master Content Type enabled
This Content Type uses as a Master Content Type. Properties from Master Content Types are not shown and can only be edited on the Master Content Type itself

-
- - -
- - -
-
-
-<%-- cannot put a <%= block here 'cos it prevents the Controls collection from being modified = use a literal --%> - \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.cs b/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.cs deleted file mode 100644 index fef17e6e2e..0000000000 --- a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Web; -using System.Web.UI.WebControls; -using AutoMapper; -using Umbraco.Core; -using Umbraco.Core.Models; -using Umbraco.Web.Editors; -using Umbraco.Web.Models.ContentEditing; - -namespace Umbraco.Web.UI.Umbraco.Controls -{ - public partial class ContentTypeControlNew : global::umbraco.controls.ContentTypeControlNew - { - protected string DataTypeControllerUrl { get; private set; } - protected string ContentTypeControllerUrl { get; private set; } - - /// - /// Raises the event. - /// - /// The object that contains the event data. - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - DataTypeControllerUrl = Url.GetUmbracoApiServiceBaseUrl(x => x.GetById(0)); - ContentTypeControllerUrl = Url.GetUmbracoApiServiceBaseUrl(x => x.GetAssignedListViewDataType(0)); - } - - protected void dgTabs_PreRender(object sender, EventArgs e) - { - dgTabs.UseAccessibleHeader = true; //to make sure we render th, not td - - Table table = dgTabs.Controls[0] as Table; - if (table != null && table.Rows.Count > 0) - { - // here we render and - if (dgTabs.ShowHeader) - table.Rows[0].TableSection = TableRowSection.TableHeader; - if (dgTabs.ShowFooter) - table.Rows[table.Rows.Count - 1].TableSection = TableRowSection.TableFooter; - } - } - - protected void dgTabs_ItemDataBound(object sender, DataGridItemEventArgs e) - { - Table table = dgTabs.Controls[0] as Table; - if (table != null && table.Rows.Count > 0) - { - if (dgTabs.ShowHeader) - table.Rows[0].TableSection = TableRowSection.TableHeader; - if (dgTabs.ShowFooter) - table.Rows[table.Rows.Count - 1].TableSection = TableRowSection.TableFooter; - } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.designer.cs b/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.designer.cs deleted file mode 100644 index 2ad0b89587..0000000000 --- a/src/Umbraco.Web.UI/umbraco/controls/ContentTypeControlNew.ascx.designer.cs +++ /dev/null @@ -1,24 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Umbraco.Web.UI.Umbraco.Controls { - - - public partial class ContentTypeControlNew { - - /// - /// JsInclude control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::ClientDependency.Core.Controls.JsInclude JsInclude; - } -} diff --git a/src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx b/src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx deleted file mode 100644 index 9ec9bbaca7..0000000000 --- a/src/Umbraco.Web.UI/umbraco/controls/GenericProperties/GenericProperty.ascx +++ /dev/null @@ -1,80 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="True" Inherits="umbraco.controls.GenericProperties.GenericProperty" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> -<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> - -
  • -
    -
    -
    - - - - - - - - - - - - -
    -
    - - -
    -
  • - \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/members/EditMemberType.aspx b/src/Umbraco.Web.UI/umbraco/members/EditMemberType.aspx deleted file mode 100644 index 80b8313be3..0000000000 --- a/src/Umbraco.Web.UI/umbraco/members/EditMemberType.aspx +++ /dev/null @@ -1,37 +0,0 @@ -<%@ Page Async="true" language="c#" MasterPageFile="../masterpages/umbracoPage.Master" AutoEventWireup="True" Inherits="umbraco.cms.presentation.members.EditMemberType" %> -<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> -<%@ Register TagPrefix="uc1" TagName="ContentTypeControlNew" Src="../controls/ContentTypeControlNew.ascx" %> -<%@ Register Namespace="umbraco" TagPrefix="umb" Assembly="umbraco" %> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Umbraco.Web.UI/umbraco/settings/EditMediaType.aspx b/src/Umbraco.Web.UI/umbraco/settings/EditMediaType.aspx deleted file mode 100644 index ab35ae3a63..0000000000 --- a/src/Umbraco.Web.UI/umbraco/settings/EditMediaType.aspx +++ /dev/null @@ -1,15 +0,0 @@ -<%@ Register TagPrefix="cc2" Namespace="umbraco.uicontrols" Assembly="controls" %> - -<%@ Page Language="c#" CodeBehind="EditMediaType.aspx.cs" MasterPageFile="../masterpages/umbracoPage.Master" - Async="true" AsyncTimeOut="300" - AutoEventWireup="True" Inherits="umbraco.cms.presentation.settings.EditMediaType" %> - -<%@ Register TagPrefix="uc1" TagName="ContentTypeControlNew" Src="../controls/ContentTypeControlNew.ascx" %> - - - - diff --git a/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx b/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx deleted file mode 100644 index b2ed9df718..0000000000 --- a/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx +++ /dev/null @@ -1,57 +0,0 @@ -<%@ Page Language="c#" CodeBehind="EditNodeTypeNew.aspx.cs" AutoEventWireup="True" ValidateRequest="false" - Async="true" AsyncTimeOut="300" Trace="false" Inherits="Umbraco.Web.UI.Umbraco.Settings.EditNodeTypeNew" MasterPageFile="../masterpages/umbracoPage.Master" %> - -<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> -<%@ Register TagPrefix="uc1" TagName="ContentTypeControlNew" Src="../controls/ContentTypeControlNew.ascx" %> - - - - - - - - - - -
    - -
    -
    - - - -
    -
    diff --git a/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.cs b/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.cs deleted file mode 100644 index f5705d25de..0000000000 --- a/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Umbraco.Web.UI.Umbraco.Settings -{ - public partial class EditNodeTypeNew : global::umbraco.settings.EditContentTypeNew - { - } -} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.designer.cs b/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.designer.cs deleted file mode 100644 index e322b494bd..0000000000 --- a/src/Umbraco.Web.UI/umbraco/settings/EditNodeTypeNew.aspx.designer.cs +++ /dev/null @@ -1,33 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Umbraco.Web.UI.Umbraco.Settings { - - - public partial class EditNodeTypeNew { - - /// - /// allowedTemplates control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel allowedTemplates; - - /// - /// defaultTemplate control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel defaultTemplate; - } -} diff --git a/src/Umbraco.Web.UI/umbraco_client/Editors/EditContentType.js b/src/Umbraco.Web.UI/umbraco_client/Editors/EditContentType.js deleted file mode 100644 index 18f47196b8..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Editors/EditContentType.js +++ /dev/null @@ -1,108 +0,0 @@ -Umbraco.Sys.registerNamespace("Umbraco.Editors"); - -(function ($) { - - var _model = {}; - var _opts = null; - - //updates the UI elements - function updateElements() { - _opts.configPanel.find("strong").html(_model.listViewName); - if (_model.isSystem) { - _opts.createListViewButton.show(); - _opts.removeListViewButton.hide(); - _opts.configPanel.find("em").show(); - } - else { - _opts.createListViewButton.hide(); - _opts.removeListViewButton.show(); - _opts.configPanel.find("em").hide(); - } - } - - function populateData() { - //get init data - - $.get(_opts.contentTypeServiceBaseUrl + "GetAssignedListViewDataType?contentTypeId=" + _opts.contentTypeId, function (result) { - _model.isSystem = result.isSystem; - _model.listViewName = result.name; - _model.listViewId = result.id; - updateElements(); - }); - } - - $.ajaxSetup({ - beforeSend: function (xhr) { - xhr.setRequestHeader("X-XSRF-TOKEN", $.cookie("XSRF-TOKEN")); - }, - contentType: 'application/json;charset=utf-8', - dataType: "json", - dataFilter: function (data, dataType) { - if ((typeof data) === "string") { - //trim the csrf bits off - data = data.replace(/^\)\]\}\'\,\n/, ""); - } - return data; - } - }); - - Umbraco.Editors.EditContentType = base2.Base.extend({ - - // Constructor - constructor: function(opts) { - // Merge options with default - _opts = $.extend({ - // Default options go here - }, opts); - }, - - init: function () { - //wire up handlers - - _opts.configPanel.find("a").click(function() { - UmbClientMgr.contentFrame('#/developer/datatype/edit/' + _model.listViewId); - }); - - _opts.isContainerChk.on("change", function () { - if ($(this).is(":checked")) { - _opts.configPanel.slideDown(); - } - else { - _opts.configPanel.slideUp(); - } - }); - - _opts.createListViewButton.click(function (event) { - event.preventDefault(); - - var data = { - parentId: -1, - id: 0, - preValues: [], - action: "SaveNew", - name: "List View - " + _opts.contentTypeAlias, - selectedEditor: "Umbraco.ListView" - }; - - $.post(_opts.dataTypeServiceBaseUrl + "PostSave", JSON.stringify(data), function (result) { - _model.isSystem = result.isSystem; - _model.listViewName = result.name; - _model.listViewId = result.id; - updateElements(); - }); - }); - - _opts.removeListViewButton.click(function (event) { - event.preventDefault(); - - $.post(_opts.dataTypeServiceBaseUrl + "DeleteById?id=" + _model.listViewId, function (result) { - //re-get the data - populateData(); - }); - }); - - populateData(); - - } - }); -})(jQuery); \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericProperty.js b/src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericProperty.js deleted file mode 100644 index 4ca59e82de..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericProperty.js +++ /dev/null @@ -1,53 +0,0 @@ -var activeDragId = ""; -function expandCollapse(theId) { - - var edit = document.getElementById("edit" + theId); - - if (edit.style.display == 'none') { - edit.style.display = 'block'; - document.getElementById("desc" + theId).style.display = 'none'; - } - else { - edit.style.display = 'none'; - document.getElementById("desc" + theId).style.display = 'block'; - } -} -function duplicatePropertyNameAsSafeAlias(propertySelector) { - $(propertySelector).each(function() { - var prop = $(this); - var inputName = prop.find('.prop-name'); - var inputAlias = prop.find('.prop-alias'); - inputName.on('input blur', function (event) { - getSafeAlias(inputAlias, inputName.val(), false, function (alias) { - if (!inputAlias.data('dirty')) - inputAlias.val(alias); - }); - }); - inputAlias.on('input', function(event) { - inputName.off('input blur'); - }); - }); -} - -function checkAlias(aliasSelector) { - $(aliasSelector).on('input', function (event) { - var input = $(this); - input.data('dirty', true); - var value = input.val(); - validateSafeAlias(input, value, false, function (isSafe) { - input.toggleClass('highlight-error', !isSafe); - }); - }).on('blur', function(event) { - var input = $(this); - if (!input.data('dirty')) return; - input.removeData('dirty'); - var value = input.val(); - getSafeAlias(input, value, true, function (alias) { - if (value.toLowerCase() != alias.toLowerCase()) - input.val(alias); - input.removeClass('highlight-error'); - }); - }); -} - -// validateSafeAlias and getSafeAlias are defined by UmbracoCasingRules.aspx diff --git a/src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericproperty.css b/src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericproperty.css deleted file mode 100644 index 5183a9bccd..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/GenericProperty/genericproperty.css +++ /dev/null @@ -1,107 +0,0 @@ - -.genericPropertyForm { - -} -.genericPropertyForm h2 { - font-size: 16px; - line-height: 20px; - margin-bottom: 2px; -} - -.genericPropertyList .header{ - padding: 4px; -} -.genericPropertyList .umb-pane{ - margin: 10px; -} - -.genericPropertyList { - margin: 0px 0px 30px 0px; - list-style: none; -} - -.genericPropertyList .delete-button, .genericPropertyList .toggle-button{ - float: right; - margin-left: 3px; - border: none; - background: none; - text-decoration: none; -} - -.genericPropertyList .delete-button i { - background: none; - border: none; -} - -.handle{ - color: #ccc; - font-size: 12px; -} - -.addNewProperty .handle { - display: none; -} - -.genericPropertyList li { - display: block; - position: relative; - border-bottom: 1px solid #eee; - margin-bottom: 3px; - cursor: move; -} - -.genericPropertyList li .delete-button i { - color: #b94a48; -} - -.addNewProperty li { - cursor: default; -} - -.genericPropertyList li table { - display: block; - margin-top: 10px; -} - -.genericPropertyList li table th { - width: 140px; - padding: 5px; -} - -.propertyFormInput { - width: 300px; - z-index: 9999; -} - -.propertyForm SELECT { - width: 300px; -} - -.propertyForm h3 a { - color: #000; - text-decoration: none; - font-size: 14px; - font-weight: normal; -} - - - -.genericPropertyList li img { - background: red; - z-index: 9999; - position: relative; - border-right: medium none; - border-top: medium none; - border-left: medium none; - margin-right: 5px; - border-bottom: medium none; -} -.genericPropertyList li h3 input { - position: relative; -} - -.aliasValidationError -{ - background-color: #ff9999; - border: 1px solid: red; -} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 0ef5b3b115..9e340bd47f 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -617,9 +617,6 @@ - - ASPXCodeBehind - ASPXCodeBehind @@ -847,9 +844,6 @@ ASPXCodeBehind - - ASPXCodeBehind - ASPXCodeBehind @@ -1083,9 +1077,6 @@ ASPXCodeBehind - - ASPXCodeBehind - ASPXCodeBehind @@ -1263,7 +1254,6 @@ UploadMediaImage.ascx - @@ -1600,13 +1590,6 @@ EditMemberGroup.aspx - - EditMemberType.aspx - ASPXCodeBehind - - - EditMemberType.aspx - search.aspx ASPXCodeBehind @@ -1697,13 +1680,6 @@ editLanguage.aspx - - EditMediaType.aspx - ASPXCodeBehind - - - EditMediaType.aspx - editScript.aspx ASPXCodeBehind @@ -2118,9 +2094,6 @@ Form - - ASPXCodeBehind - Designer @@ -2128,9 +2101,6 @@ ASPXCodeBehind - - ASPXCodeBehind - ASPXCodeBehind diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs deleted file mode 100644 index 24694ad706..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentTypeControlNew.ascx.cs +++ /dev/null @@ -1,1879 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Web; -using System.Web.Mvc; -using System.Threading.Tasks; -using System.Web; -using System.Web.Routing; -using System.Web.UI; -using System.Web.UI.HtmlControls; -using System.Web.UI.WebControls; -using ClientDependency.Core; -using Umbraco.Core; -using Umbraco.Core.Configuration; -using Umbraco.Core.Exceptions; -using Umbraco.Core.Logging; -using Umbraco.Core.Models; -using Umbraco.Core.Strings; -using Umbraco.Web.UI.Controls; -using umbraco.BusinessLogic; -using umbraco.cms.businesslogic; -using umbraco.cms.businesslogic.propertytype; -using umbraco.cms.businesslogic.web; -using umbraco.cms.helpers; -using umbraco.controls.GenericProperties; -using Umbraco.Core.IO; -using umbraco.presentation; -using umbraco.BasePages; -using Constants = Umbraco.Core.Constants; -using ContentType = umbraco.cms.businesslogic.ContentType; -using PropertyType = Umbraco.Core.Models.PropertyType; - -namespace umbraco.controls -{ - - [ClientDependency(ClientDependencyType.Javascript, "ui/jqueryui.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "ui/jquery.dd.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Css, "ui/dd.css", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Css, "GenericProperty/genericproperty.css", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "GenericProperty/genericproperty.js", "UmbracoClient")] - public partial class ContentTypeControlNew : UmbracoUserControl - { - // General Private members - private ContentType _contentType; - private static string UmbracoPath = SystemDirectories.Umbraco; - public bool HideStructure { get; set; } - public Func DocumentTypeCallback { get; set; } - - protected string ContentTypeAlias - { - get { return _contentType.Alias; } - } - protected int ContentTypeId - { - get { return _contentType.Id; } - } - - // "Tab" tab - protected uicontrols.Pane Pane8; - - // "Structure" tab - protected DualSelectbox DualAllowedContentTypes = new DualSelectbox(); - - // "Structure" tab - Compositions - protected DualSelectbox DualContentTypeCompositions = new DualSelectbox(); - - // "Info" tab - public uicontrols.TabPage InfoTabPage; - - // "Generic properties" tab - public uicontrols.TabPage GenericPropertiesTabPage; - - public GenericPropertyWrapper gp; - private DataTable _dataTypeTable; - private ArrayList _genericProperties = new ArrayList(); - private ArrayList _sortLists = new ArrayList(); - - //the async saving task - private Action _asyncSaveTask; - //the async delete property task - private Action _asyncDeleteTask; - - internal event SavingContentTypeEventHandler SavingContentType; - internal delegate void SavingContentTypeEventHandler(ContentType e); - - override protected void OnInit(EventArgs e) - { - base.OnInit(e); - - LoadContentType(); - - SetupInfoPane(); - - if (HideStructure) - { - pnlStructure.Visible = false; - } - else - { - SetupStructurePane(); - SetupCompositionsPane(); - } - - SetupGenericPropertiesPane(); - SetupTabPane(); - - // [ClientDependency(ClientDependencyType.Javascript, "js/UmbracoCasingRules.aspx", "UmbracoRoot")] - var loader = ClientDependency.Core.Controls.ClientDependencyLoader.GetInstance(new HttpContextWrapper(Context)); - var helper = new UrlHelper(new RequestContext(new HttpContextWrapper(Context), new RouteData())); - loader.RegisterDependency(helper.GetCoreStringsControllerPath() + "ServicesJavaScript", ClientDependencyType.Javascript); - } - - protected void Page_Load(object sender, EventArgs e) - { - pp_newTab.Text = ui.Text("newtab", Security.CurrentUser); - pp_alias.Text = ui.Text("alias", Security.CurrentUser); - pp_name.Text = ui.Text("name", Security.CurrentUser); - pp_allowedChildren.Text = ui.Text("allowedchildnodetypes", Security.CurrentUser); - pp_compositions.Text = ui.Text("contenttypecompositions", Security.CurrentUser); - pp_description.Text = ui.Text("editcontenttype", "description", Security.CurrentUser); - pp_icon.Text = ui.Text("icon", Security.CurrentUser); - pp_Root.Text = ui.Text("editcontenttype", "allowAtRoot", Security.CurrentUser) + "
    " + ui.Text("editcontenttype", "allowAtRootDesc", Security.CurrentUser) + ""; - pp_isContainer.Text = ui.Text("editcontenttype", "hasListView", Security.CurrentUser) + "
    " + ui.Text("editcontenttype", "hasListViewDesc", Security.CurrentUser) + ""; - - // we'll disable this... - if (!Page.IsPostBack && _contentType.MasterContentType != 0) - { - string masterName = ContentType.GetContentType(_contentType.MasterContentType).Text; - tabsMasterContentTypeName.Text = masterName; - propertiesMasterContentTypeName.Text = masterName; - PaneTabsInherited.Visible = true; - PanePropertiesInherited.Visible = true; - } - - if (string.IsNullOrEmpty(_contentType.IconUrl)) - lt_icon.Text = "icon-document"; - else - lt_icon.Text = _contentType.IconUrl.TrimStart('.'); - - checkTxtAliasJs.Text = string.Format("checkAlias('#{0}');", txtAlias.ClientID); - - } - - /// - /// A class to track the async state for deleting a doc type property - /// - private class DeleteAsyncState - { - public Umbraco.Web.UmbracoContext UmbracoContext { get; private set; } - public GenericPropertyWrapper GenericPropertyWrapper { get; private set; } - - public DeleteAsyncState( - Umbraco.Web.UmbracoContext umbracoContext, - GenericPropertyWrapper genericPropertyWrapper) - { - UmbracoContext = umbracoContext; - GenericPropertyWrapper = genericPropertyWrapper; - } - } - - /// - /// A class to track the async state for saving the doc type - /// - private class SaveAsyncState - { - public SaveAsyncState( - Umbraco.Web.UmbracoContext umbracoContext, - SaveClickEventArgs saveArgs, - string originalAlias, - string originalName, - string newAlias, - string newName, - string[] originalPropertyAliases) - { - UmbracoContext = umbracoContext; - SaveArgs = saveArgs; - _originalAlias = originalAlias; - _originalName = originalName; - _newAlias = newAlias; - _originalPropertyAliases = originalPropertyAliases; - _newName = newName; - } - - public Umbraco.Web.UmbracoContext UmbracoContext { get; private set; } - public SaveClickEventArgs SaveArgs { get; private set; } - private readonly string _originalAlias; - private readonly string _originalName; - private readonly string _newAlias; - private readonly string _newName; - private readonly string[] _originalPropertyAliases; - - - public bool HasAliasChanged() - { - return (string.Compare(_originalAlias, _newAlias, StringComparison.OrdinalIgnoreCase) != 0); - } - public bool HasNameChanged() - { - return (string.Compare(_originalName, _newName, StringComparison.OrdinalIgnoreCase) != 0); - } - - /// - /// Returns true if any property has been removed or if any alias has changed - /// - /// - /// - public bool HasAnyPropertyAliasChanged(ContentType contentType) - { - var newAliases = contentType.PropertyTypes.Select(x => x.Alias).ToArray(); - //if any have been removed, return true - if (newAliases.Length < _originalPropertyAliases.Count()) - { - return true; - } - //otherwise ensure that all of the original aliases are still existing - return newAliases.ContainsAll(_originalPropertyAliases) == false; - } - } - - /// - /// Called asynchronously in order to persist all of the data to the database - /// - /// - /// - /// - /// - /// - /// - /// This can be a long running operation depending on how many content nodes exist and if the node type alias - /// has changed as this will need to regenerate XML for all of the nodes. - /// - private IAsyncResult BeginAsyncSaveOperation(object sender, EventArgs e, AsyncCallback cb, object state) - { - Trace.Write("ContentTypeControlNew", "Start async operation"); - - //get the args from the async state - var args = (SaveAsyncState)state; - - //start the task - var result = _asyncSaveTask.BeginInvoke(args, cb, args); - return result; - } - - /// - /// Occurs once the async database save operation has completed - /// - /// - /// - /// This updates the UI elements - /// - private void EndAsyncSaveOperation(IAsyncResult ar) - { - Trace.Write("ContentTypeControlNew", "ending async operation"); - - //get the args from the async state - var state = (SaveAsyncState)ar.AsyncState; - - // reload content type (due to caching) - LoadContentType(); - BindTabs(); - BindDataGenericProperties(true); - - // we need to re-bind the alias as the SafeAlias method can have changed it - txtAlias.Text = _contentType.Alias; - - //Notify the parent control - RaiseBubbleEvent(new object(), state.SaveArgs); - - if (state.HasNameChanged()) - UpdateTreeNode(); - - Trace.Write("ContentTypeControlNew", "async operation ended"); - - //complete it - _asyncSaveTask.EndInvoke(ar); - } - - /// - /// The save button click event handlers - /// - /// - /// - protected void save_click(object sender, EventArgs e) - { - - //sync state betweet lt and hidden value - lt_icon.Text = tb_icon.Value; - - var state = new SaveAsyncState( - UmbracoContext, - new SaveClickEventArgs("Saved") - { - IconType = BasePage.speechBubbleIcon.success - }, _contentType.Alias, _contentType.Text, txtAlias.Text, txtName.Text, _contentType.PropertyTypes.Select(x => x.Alias).ToArray()); - - var isMediaType = Request.Path.ToLowerInvariant().Contains("editmediatype.aspx"); - - //Add the async operation to the page - //NOTE: Must pass in a null and do not pass in a true to the 'executeInParallel', this is changed in .net 4.5 for the better, otherwise you'll get a ysod. - Page.RegisterAsyncTask(new PageAsyncTask(BeginAsyncSaveOperation, EndAsyncSaveOperation, null, state)); - - //create the save task to be executed async - _asyncSaveTask = asyncState => - { - Trace.Write("ContentTypeControlNew", "executing task"); - - //we need to re-set the UmbracoContext since it will be nulled and our cache handlers need it - global::Umbraco.Web.UmbracoContext.Current = asyncState.UmbracoContext; - - _contentType.ContentTypeItem.Name = txtName.Text; - _contentType.ContentTypeItem.Alias = txtAlias.Text; // raw, contentType.Alias takes care of it - _contentType.ContentTypeItem.Icon = tb_icon.Value; - _contentType.ContentTypeItem.Description = description.Text; - //_contentType.ContentTypeItem.Thumbnail = ddlThumbnails.SelectedValue; - _contentType.ContentTypeItem.AllowedAsRoot = allowAtRoot.Checked; - _contentType.ContentTypeItem.IsContainer = cb_isContainer.Checked; - - int i = 0; - var ids = SaveAllowedChildTypes(); - _contentType.ContentTypeItem.AllowedContentTypes = ids.Select(x => new ContentTypeSort(x, i++)); - - // figure out whether compositions are locked - var allContentTypes = Request.Path.ToLowerInvariant().Contains("editmediatype.aspx") - ? ApplicationContext.Services.ContentTypeService.GetAllMediaTypes().Cast().ToArray() - : ApplicationContext.Services.ContentTypeService.GetAllContentTypes().Cast().ToArray(); - var isUsing = allContentTypes.Where(x => x.ContentTypeComposition.Any(y => y.Id == _contentType.Id)).ToArray(); - - // if compositions are locked, do nothing (leave them as they are) - // else process the checkbox list and add/remove compositions accordingly - - if (isUsing.Length == 0) - { - //Saving ContentType Compositions - var compositionIds = SaveCompositionContentTypes(); - var existingCompsitionIds = _contentType.ContentTypeItem.CompositionIds().ToList(); - if (compositionIds.Any()) - { - // if some compositions were checked in the list, iterate over them - foreach (var compositionId in compositionIds) - { - // ignore if it is the current content type - if (_contentType.Id.Equals(compositionId)) continue; - - // ignore if it is already a composition of the content type - if (existingCompsitionIds.Any(x => x.Equals(compositionId))) continue; - - // add to the content type compositions - var compositionType = isMediaType - ? Services.ContentTypeService.GetMediaType(compositionId).SafeCast() - : Services.ContentTypeService.GetContentType(compositionId).SafeCast(); - try - { - //TODO if added=false then return error message - var added = _contentType.ContentTypeItem.AddContentType(compositionType); - } - catch (InvalidCompositionException ex) - { - state.SaveArgs.IconType = BasePage.speechBubbleIcon.error; - state.SaveArgs.Message = ex.Message; - } - } - - // then iterate over removed = existing except checked - var removeIds = existingCompsitionIds.Except(compositionIds); - foreach (var removeId in removeIds) - { - // and remove from the content type composition - var compositionType = isMediaType - ? Services.ContentTypeService.GetMediaType(removeId).SafeCast() - : Services.ContentTypeService.GetContentType(removeId).SafeCast(); - var removed = _contentType.ContentTypeItem.RemoveContentType(compositionType.Alias); - } - } - else if (existingCompsitionIds.Any()) - { - // else none were checked - if the content type had compositions, - // iterate over them all and remove them - var removeIds = existingCompsitionIds.Except(compositionIds); // except here makes no sense? - foreach (var removeId in removeIds) - { - // remove existing - var compositionType = isMediaType - ? Services.ContentTypeService.GetMediaType(removeId).SafeCast() - : Services.ContentTypeService.GetContentType(removeId).SafeCast(); - var removed = _contentType.ContentTypeItem.RemoveContentType(compositionType.Alias); - } - } - } - - var tabs = SaveTabs(); // returns { TabId, TabName, TabSortOrder } - foreach (var tab in tabs) - { - var group = _contentType.ContentTypeItem.PropertyGroups.FirstOrDefault(x => x.Id == tab.Item1); - if (group == null) - { - // creating a group - group = new PropertyGroup {Id = tab.Item1, Name = tab.Item2, SortOrder = tab.Item3}; - _contentType.ContentTypeItem.PropertyGroups.Add(group); - } - else - { - // updating an existing group - group.Name = tab.Item2; - group.SortOrder = tab.Item3; - } - } - - SavePropertyType(asyncState.SaveArgs, _contentType.ContentTypeItem); - //SavePropertyType(state.SaveArgs, _contentType.ContentTypeItem); - UpdatePropertyTypes(_contentType.ContentTypeItem); - - if (DocumentTypeCallback != null) - { - var documentType = _contentType as DocumentType; - if (documentType != null) - { - var result = DocumentTypeCallback(documentType); - } - } - - if (SavingContentType != null) - { - SavingContentType(_contentType); - } - - try - { - _contentType.Save(); - } - catch (DuplicateNameException ex) - { - DuplicateAliasValidator.IsValid = false; - //asyncState.SaveArgs.IconType = BasePage.speechBubbleIcon.error; - state.SaveArgs.IconType = BasePage.speechBubbleIcon.error; - //asyncState.SaveArgs.Message = ex.Message; - state.SaveArgs.Message = ex.Message; - return; - } - catch (Exception ex) - { - state.SaveArgs.IconType = BasePage.speechBubbleIcon.error; - state.SaveArgs.Message = ex.Message; - } - - Trace.Write("ContentTypeControlNew", "task completing"); - }; - - //execute the async tasks - Page.ExecuteRegisteredAsyncTasks(); - } - - /// - /// Loads the current ContentType from the id found in the querystring. - /// The correct type is loaded based on editing location (DocumentType, MediaType or MemberType). - /// - private void LoadContentType() - { - int docTypeId = int.Parse(Request.QueryString["id"]); - LoadContentType(docTypeId); - } - - private void LoadContentType(int docTypeId) - { - //Fairly hacky code to load the ContentType as the real type instead of its base type, so it can be properly saved. - if (Request.Path.ToLowerInvariant().Contains("editnodetypenew.aspx")) - { - _contentType = new DocumentType(docTypeId); - } - else if (Request.Path.ToLowerInvariant().Contains("editmediatype.aspx")) - { - _contentType = new cms.businesslogic.media.MediaType(docTypeId); - } - else if (Request.Path.ToLowerInvariant().Contains("editmembertype.aspx")) - { - _contentType = new cms.businesslogic.member.MemberType(docTypeId); - } - else - { - _contentType = new ContentType(docTypeId); - } - } - - /// - /// Updates the Node in the Tree - /// - private void UpdateTreeNode() - { - var clientTools = new ClientTools(this.Page); - clientTools - .SyncTree(_contentType.Path, true); - } - - #region "Info" Pane - - private void SetupInfoPane() - { - InfoTabPage = TabView1.NewTabPage("Info"); - InfoTabPage.Controls.Add(pnlInfo); - - var Save = TabView1.Menu.NewButton(); - Save.Click += save_click; - Save.Text = ui.Text("save", Security.CurrentUser); - Save.ID = "save"; - Save.ButtonType = uicontrols.MenuButtonType.Primary; - - txtName.Text = _contentType.GetRawText(); - txtAlias.Text = _contentType.Alias; - description.Text = _contentType.GetRawDescription(); - tb_icon.Value = _contentType.IconUrl; - - if(string.IsNullOrEmpty(_contentType.IconUrl)) - lt_icon.Text = "icon-document"; - else - lt_icon.Text = _contentType.IconUrl.TrimStart('.'); - - /* - var dirInfo = new DirectoryInfo(Server.MapPath(SystemDirectories.Umbraco + "/images/umbraco")); - var fileInfo = dirInfo.GetFiles(); - - var spriteFileNames = CMSNode.DefaultIconClasses.Select(IconClassToIconFileName).ToList(); - var diskFileNames = fileInfo.Select(FileNameToIconFileName).ToList(); - var listOfIcons = new List(); - // .sprNew was never intended to be in the document type editor - foreach (var iconClass in CMSNode.DefaultIconClasses.Where(iconClass => iconClass.Equals(".sprNew", StringComparison.InvariantCultureIgnoreCase) == false)) - { - // Still shows the selected even if we tell it to hide sprite duplicates so as not to break an existing selection - if (_contentType.IconUrl.Equals(iconClass, StringComparison.InvariantCultureIgnoreCase) == false - && UmbracoConfiguration.Current.UmbracoSettings.Content.IconPickerBehaviour == IconPickerBehaviour.HideSpriteDuplicates - && diskFileNames.Contains(IconClassToIconFileName(iconClass))) - continue; - - AddSpriteListItem(iconClass, listOfIcons); - } - - foreach (var file in fileInfo) - { - // NH: don't show the sprite file - if (file.Name.ToLowerInvariant() == "sprites.png".ToLowerInvariant() || file.Name.ToLowerInvariant() == "sprites_ie6.gif".ToLowerInvariant()) - continue; - - // Still shows the selected even if we tell it to hide file duplicates so as not to break an existing selection - if (_contentType.IconUrl.Equals(file.Name, StringComparison.InvariantCultureIgnoreCase) == false - && UmbracoConfiguration.Current.UmbracoSettings.Content.IconPickerBehaviour == IconPickerBehaviour.HideFileDuplicates - && spriteFileNames.Contains(FileNameToIconFileName(file))) - continue; - - var listItemValue = ResolveClientUrl(SystemDirectories.Umbraco + "/images/umbraco/" + file.Name); - - AddFileListItem(file.Name, listItemValue, listOfIcons); - } - - ddlIcons.Items.AddRange(listOfIcons.OrderBy(o => o.Text).ToArray()); - - - // Get thumbnails - dirInfo = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Umbraco + "/images/thumbnails")); - fileInfo = dirInfo.GetFiles(); - - foreach (var file in fileInfo) - { - var li = new ListItem(file.Name); - li.Attributes.Add("title", this.ResolveClientUrl(SystemDirectories.Umbraco + "/images/thumbnails/" + file.Name)); - - if (this.Page.IsPostBack == false && li.Value == _contentType.Thumbnail) - li.Selected = true; - - // ddlThumbnails.Items.Add(li); - } - - - Page.ClientScript.RegisterStartupScript(this.GetType(), "thumbnailsDropDown", string.Format(@" -function refreshDropDowns() {{ - jQuery('#{1}').msDropDown({{ showIcon: true, style: 'width:250px;' }}); - jQuery('#{3}').msDropDown({{ showIcon: false, rowHeight: '130', visibleRows: '2', style: 'width:250px;' }}); -}} -jQuery(document).ready(function() {{ refreshDropDowns(); }}); -", ddlIcons.ClientID, ddlIcons.ClientID, ddlIcons.ClientID, ddlThumbnails.ClientID, 500), true); - txtName.Text = _contentType.GetRawText(); - txtAlias.Text = _contentType.Alias; - description.Text = _contentType.GetRawDescription(); - */ - } - - private void AddListItem(ICollection listOfIcons, ListItem li) - { - if (this.Page.IsPostBack == false && li.Value == _contentType.IconUrl) - li.Selected = true; - - listOfIcons.Add(li); - } - - #endregion - - #region "Structure" Pane - - private void SetupStructurePane() - { - DualAllowedContentTypes.ID = "allowedContentTypes"; - DualAllowedContentTypes.Width = 175; - - uicontrols.TabPage tp = TabView1.NewTabPage("Structure"); - tp.Controls.Add(pnlStructure); - - int[] allowedIds = _contentType.AllowedChildContentTypeIDs; - if (!Page.IsPostBack) - { - string chosenContentTypeIDs = ""; - ContentType[] contentTypes = _contentType.GetAll(); - foreach (ContentType ct in contentTypes.OrderBy(x => x.Text)) - { - ListItem li = new ListItem(ct.Text, ct.Id.ToString()); - DualAllowedContentTypes.Items.Add(li); - lstAllowedContentTypes.Items.Add(li); - foreach (int i in allowedIds) - { - if (i == ct.Id) - { - li.Selected = true; - chosenContentTypeIDs += ct.Id + ","; - } - } - } - DualAllowedContentTypes.Value = chosenContentTypeIDs; - } - - allowAtRoot.Checked = _contentType.AllowAtRoot; - cb_isContainer.Checked = _contentType.IsContainerContentType; - } - - private int[] SaveAllowedChildTypes() - { - var tmp = new ArrayList(); - foreach (ListItem li in lstAllowedContentTypes.Items) - { - if (li.Selected) - tmp.Add(int.Parse(li.Value)); - } - var ids = new int[tmp.Count]; - for (int i = 0; i < tmp.Count; i++) ids[i] = (int)tmp[i]; - - return ids; - } - - #endregion - - #region Compositions Pane - - // returns content type compositions, recursively - // return each content type once and only once - private IEnumerable GetIndirect(IContentTypeComposition ctype) - { - // hashset guarantees unicity on Id - var all = new HashSet(new DelegateEqualityComparer( - (x, y) => x.Id == y.Id, - x => x.Id)); - - var stack = new Stack(); - - foreach (var x in ctype.ContentTypeComposition) - stack.Push(x); - - while (stack.Count > 0) - { - var x = stack.Pop(); - all.Add(x); - foreach (var y in x.ContentTypeComposition) - stack.Push(y); - } - - return all; - } - - private void SetupCompositionsPane() - { - DualContentTypeCompositions.ID = "compositionContentTypes"; - DualContentTypeCompositions.Width = 175; - - // fix for 7.2 - only top-level content types can be used as mixins - - if (Page.IsPostBack == false) - { - var allContentTypes = Request.Path.ToLowerInvariant().Contains("editmediatype.aspx") - ? ApplicationContext.Services.ContentTypeService.GetAllMediaTypes().Cast().ToArray() - : ApplicationContext.Services.ContentTypeService.GetAllContentTypes().Cast().ToArray(); - - // note: there are many sanity checks missing here and there ;-(( - // make sure once and for all - //if (allContentTypes.Any(x => x.ParentId > 0 && x.ContentTypeComposition.Any(y => y.Id == x.ParentId) == false)) - // throw new Exception("A parent does not belong to a composition."); - - // find out if any content type uses this content type - var isUsing = allContentTypes.Where(x => x.ContentTypeComposition.Any(y => y.Id == _contentType.Id)).ToArray(); - if (isUsing.Length > 0) - { - // if it is used then it has to remain top-level - - // no composition is possible at all - DualContentTypeCompositions.Items.Clear(); - lstContentTypeCompositions.Items.Clear(); - DualContentTypeCompositions.Value = ""; - - PlaceHolderContentTypeCompositions.Controls.Add(new Literal { Text = "This content type is used as a parent and/or in " - + "a composition, and therefore cannot be composed itself.

    Used by: " - + string.Join(", ", isUsing.Select(x => x.Name)) - + "
    " }); - } - else - { - // if it is not used then composition is possible - - // hashset guarantees unicity on Id - var list = new HashSet(new DelegateEqualityComparer( - (x, y) => x.Id == y.Id, - x => x.Id)); - - // usable types are those that are top-level - var usableContentTypes = allContentTypes - .Where(x => x.ContentTypeComposition.Any() == false).ToArray(); - foreach (var x in usableContentTypes) - list.Add(x); - - // indirect types are those that we use, directly or indirectly - var indirectContentTypes = GetIndirect(_contentType.ContentTypeItem).ToArray(); - foreach (var x in indirectContentTypes) - list.Add(x); - - // directContentTypes are those we use directly - // they are already in indirectContentTypes, no need to add to the list - var directContentTypes = _contentType.ContentTypeItem.ContentTypeComposition.ToArray(); - - var enabled = usableContentTypes.Select(x => x.Id) // those we can use - .Except(indirectContentTypes.Select(x => x.Id)) // except those that are indirectly used - .Union(directContentTypes.Select(x => x.Id)) // but those that are directly used - .Where(x => x != _contentType.ParentId) // but not the parent - .Distinct() - .ToArray(); - - var wtf = new List(); - foreach (var contentType in list.OrderBy(x => x.Name).Where(x => x.Id != _contentType.Id)) - { - var li = new ListItem(contentType.Name, contentType.Id.ToInvariantString()) - { - // disable parent and anything that's not usable - Enabled = enabled.Contains(contentType.Id), - // select - Selected = indirectContentTypes.Any(x => x.Id == contentType.Id) - }; - - DualContentTypeCompositions.Items.Add(li); - lstContentTypeCompositions.Items.Add(li); - - if (li.Selected) - wtf.Add(contentType.Id); - } - DualContentTypeCompositions.Value = string.Join(",", wtf); - } - } - - //int[] compositionIds = _contentType.ContentTypeItem.CompositionIds().ToArray(); - //if (!Page.IsPostBack) - //{ - // string chosenContentTypeIDs = ""; - // ContentType[] contentTypes = _contentType.GetAll(); - // foreach (ContentType ct in contentTypes.OrderBy(x => x.Text)) - // { - // ListItem li = new ListItem(ct.Text, ct.Id.ToString()); - // if (ct.Id == _contentType.Id) - // li.Enabled = false; - - // DualContentTypeCompositions.Items.Add(li); - // lstContentTypeCompositions.Items.Add(li); - - // foreach (int i in compositionIds) - // { - // if (i == ct.Id) - // { - // li.Selected = true; - // chosenContentTypeIDs += ct.Id + ","; - // } - // } - // } - // DualContentTypeCompositions.Value = chosenContentTypeIDs; - //} - } - - private int[] SaveCompositionContentTypes() - { - return lstContentTypeCompositions.Items.Cast() - .Where(x => x.Selected) - .Select(x => int.Parse(x.Value)) - .ToArray(); - } - - #endregion - - #region "Generic properties" Pane - - private void SetupGenericPropertiesPane() - { - GenericPropertiesTabPage = TabView1.NewTabPage("Generic properties"); - GenericPropertiesTabPage.Controls.Add(pnlProperties); - BindDataGenericProperties(false); - } - - private void BindDataGenericProperties(bool refresh) - { - var tabs = _contentType.getVirtualTabs; - var propertyTypeGroups = _contentType.PropertyTypeGroups.ToList(); - var dtds = cms.businesslogic.datatype.DataTypeDefinition.GetAll().OrderBy(d => d.Text).ToArray(); - - PropertyTypes.Controls.Clear(); - - // Add new property - if (PropertyTypeNew.Controls.Count == 0) - { - PropertyTypeNew.Controls.Add(new LiteralControl("

    Add New Property

      ")); - gp = new GenericPropertyWrapper(); - gp.ID = "GenericPropertyNew"; - gp.Tabs = tabs; - gp.DataTypeDefinitions = dtds; - PropertyTypeNew.Controls.Add(gp); - PropertyTypeNew.Controls.Add(new LiteralControl("
    ")); - } - else if (refresh) - { - gp = (GenericPropertyWrapper)PropertyTypeNew.Controls[1]; - gp.ID = "GenericPropertyNew"; - gp.Tabs = tabs; - gp.DataTypeDefinitions = dtds; - gp.UpdateEditControl(); - gp.GenricPropertyControl.UpdateInterface(); - gp.GenricPropertyControl.Clear(); - } - - _genericProperties.Clear(); - var inTab = new Hashtable(); - int counter = 0; - - PropertyTypes.Controls.Add(new LiteralControl("
    ")); // opens draggable container for properties on tabs - - foreach (var tab in tabs) - { - string tabName = tab.GetRawCaption(); - string tabCaption = tabName; - if (tab.ContentType != _contentType.Id) - { - tabCaption += " (inherited from " + new ContentType(tab.ContentType).Text + ")"; - } - - PropertyTypes.Controls.Add(new LiteralControl("

    Tab: " + tabCaption + "

    ")); - - // fixme - cannot use ParentId anymore - and I have no idea what we are trying to do here ;-( - //var propertyGroup = propertyTypeGroups.SingleOrDefault(x => x.ParentId == tab.Id); - //var propertyTypes = (propertyGroup == null - // ? tab.GetPropertyTypes(_contentType.Id, false) - // : propertyGroup.GetPropertyTypes()).ToArray(); - var propertyTypes = tab.GetPropertyTypes(_contentType.Id, false).ToArray(); - - var propertyGroupId = tab.Id; - - var propSort = new HtmlInputHidden(); - propSort.ID = "propSort_" + propertyGroupId + "_Content"; - PropertyTypes.Controls.Add(propSort); - _sortLists.Add(propSort); - - if (propertyTypes.Any(x => x.ContentTypeId == _contentType.Id)) - { - PropertyTypes.Controls.Add(new LiteralControl("
      ")); - - foreach (var pt in propertyTypes) - { - //If the PropertyType doesn't belong on this ContentType skip it and continue to the next one - if (pt.ContentTypeId != _contentType.Id) continue; - - cms.businesslogic.datatype.DataTypeDefinition[] filteredDtds; - var gpw = GetPropertyWrapperForPropertyType(pt, dtds, out filteredDtds); - gpw.ID = "gpw_" + pt.Id; - gpw.PropertyType = pt; - gpw.Tabs = tabs; - gpw.TabId = propertyGroupId; - gpw.DataTypeDefinitions = filteredDtds; - gpw.Delete += gpw_Delete; - gpw.FullId = "t_" + propertyGroupId + "_Contents_" + +pt.Id; - - PropertyTypes.Controls.Add(gpw); - _genericProperties.Add(gpw); - if (refresh) - gpw.GenricPropertyControl.UpdateInterface(); - - inTab.Add(pt.Id.ToString(CultureInfo.InvariantCulture), ""); - counter++; - } - - PropertyTypes.Controls.Add(new LiteralControl("
    ")); - } - else - { - AddNoPropertiesDefinedMessage(); - } - - var jsSortable = GetJavaScriptForPropertySorting(propSort.ClientID); - Page.ClientScript.RegisterStartupScript(this.GetType(), propSort.ClientID, jsSortable, true); - - PropertyTypes.Controls.Add(new LiteralControl("
    ")); - } - - // Generic properties tab - counter = 0; - bool propertyTabHasProperties = false; - var propertiesPh = new PlaceHolder(); - propertiesPh.ID = "propertiesPH"; - PropertyTypes.Controls.Add(new LiteralControl("

    Tab: Generic Properties

    ")); - PropertyTypes.Controls.Add(propertiesPh); - - var propSortGp = new HtmlInputHidden(); - propSortGp.ID = "propSort_general_Content"; - PropertyTypes.Controls.Add(propSortGp); - _sortLists.Add(propSortGp); - - propertiesPh.Controls.Add(new LiteralControl("
      ")); - foreach (var pt in _contentType.PropertyTypes) - { - //This use to be: - if (pt.ContentTypeId == _contentType.Id && inTab.ContainsKey(pt.Id.ToString(CultureInfo.InvariantCulture)) == false) - //But seriously, if it's not on a tab the tabId is 0, it's a lot easier to read IMO - //if (pt.ContentTypeId == _contentType.Id && pt.TabId == 0) - { - cms.businesslogic.datatype.DataTypeDefinition[] filteredDtds; - var gpw = GetPropertyWrapperForPropertyType(pt, dtds, out filteredDtds); - - // Changed by duckie, was: - // gpw.ID = "gpw_" + editPropertyType.Alias; - // Which is NOT unique! - gpw.ID = "gpw_" + pt.Id; - - gpw.PropertyType = pt; - gpw.Tabs = tabs; - gpw.DataTypeDefinitions = filteredDtds; - gpw.Delete += new EventHandler(gpw_Delete); - gpw.FullId = "t_general_Contents_" + pt.Id; - - propertiesPh.Controls.Add(gpw); - _genericProperties.Add(gpw); - if (refresh) - gpw.GenricPropertyControl.UpdateInterface(); - inTab.Add(pt.Id, ""); - propertyTabHasProperties = true; - counter++; - } - } - - propertiesPh.Controls.Add(new LiteralControl("
    ")); - - var jsSortable_gp = GetJavaScriptForPropertySorting(propSortGp.ClientID); - - Page.ClientScript.RegisterStartupScript(this.GetType(), "propSort_gp", jsSortable_gp, true); - - - if (!propertyTabHasProperties) - { - AddNoPropertiesDefinedMessage(); - PropertyTypes.Controls.Remove(PropertyTypes.FindControl("propertiesPH")); - } - else - { - PropertyTypes.Controls.Add(propertiesPh); - } - - PropertyTypes.Controls.Add(new LiteralControl("
    ")); // closes draggable container for properties on tabs - - } - - /// - /// Returns a generic property wrapper for a given property - this determines if the property type should be - /// allowed to be editable. - /// - /// - private GenericPropertyWrapper GetPropertyWrapperForPropertyType( - cms.businesslogic.propertytype.PropertyType pt, - cms.businesslogic.datatype.DataTypeDefinition[] allDtds, - out cms.businesslogic.datatype.DataTypeDefinition[] filteredDefinitions) - { - filteredDefinitions = allDtds; - - //not editable if any of the built in member types - if (_contentType.ContentTypeItem is IMemberType) - { - var builtInAliases = global::Umbraco.Core.Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); - var gpw = new GenericPropertyWrapper(builtInAliases.Contains(pt.Alias) == false); - return gpw; - } - - //not editable if prefixed with the special internal prefix - if (pt.Alias.StartsWith(Constants.PropertyEditors.InternalGenericPropertiesPrefix)) - { - var gpw = new GenericPropertyWrapper(false); - return gpw; - } - - //the rest are editable - return new GenericPropertyWrapper(); - } - - private string GetJavaScriptForPropertySorting(string propSortClientId) - { - return @"(function($) { - var propSortId = ""#" + propSortClientId + @"""; - $(document).ready(function() { - $(propSortId).next("".genericPropertyList"").sortable({ - containment: '#tabs-container', - connectWith: '.genericPropertyList', - cancel: 'li.no-properties-on-tab, .propertyForm div[id^=""editbody""]', - tolerance: 'pointer', - start: function() { - $('#tabs-container').addClass('doc-type-property-drop-zone'); - }, - stop: function() { - $('#tabs-container').removeClass('doc-type-property-drop-zone'); - }, - update: function(event, ui) { - - // Save new sort details for tab - $(propSortId).val($(this).sortable('serialize')); - - // Handle move to new tab - // - find tab name - var tabName = $(this).siblings('h2').attr('data-tabname'); - - // - find tab drop-down for item and set option selected that matches tab name - var tabDropDownList = $(""select[name$='ddlTab']"", ui.item); - $('option', tabDropDownList).each(function() { - if ($(this).text() == tabName) { - $(this).attr('selected', 'selected'); - } - }); - - // Remove any no properties messages for tabs that now have a property - $('li.no-properties-on-tab', $(this)).remove(); - - // Add a no properties message for tabs that now have no properties - $('#tabs-container ul.genericPropertyList:not(:has(li))').append('" + GetHtmlForNoPropertiesMessageListItem() + @"'); - - }}); - }); - })(jQuery);"; - } - - private void AddNoPropertiesDefinedMessage() - { - // Create no properties message as a ul in order to allow dragging of properties to it from other tabs - PropertyTypes.Controls.Add(new LiteralControl("
      " + GetHtmlForNoPropertiesMessageListItem() + "
    ")); - } - - private string GetHtmlForNoPropertiesMessageListItem() - { - return @"
  • " + ui.Text("settings", "noPropertiesDefinedOnTab", Security.CurrentUser) + "
  • "; - } - - private void SavePropertyType(SaveClickEventArgs e, IContentTypeComposition contentTypeItem) - { - this.CreateChildControls(); - - //The GenericPropertyWrapper control, which contains the details for the PropertyType being added - GenericProperty gpData = gp.GenricPropertyControl; - if (string.IsNullOrEmpty(gpData.Name.Trim()) == false && string.IsNullOrEmpty(gpData.Alias.Trim()) == false) - { - // when creating a property don't do anything special, propertyType.Alias will take care of it - // don't enforce camel here because the user might have changed what the CoreStringsController returned - var propertyTypeAlias = gpData.Alias; - if (contentTypeItem.PropertyTypeExists(propertyTypeAlias) == false) - { - //Find the DataTypeDefinition that the PropertyType should be based on - var dataTypeDefinition = ApplicationContext.Current.Services.DataTypeService.GetDataTypeDefinitionById(gpData.Type); - var propertyType = new PropertyType(dataTypeDefinition) - { - Alias = propertyTypeAlias, - Name = gpData.Name.Trim(), - Mandatory = gpData.Mandatory, - ValidationRegExp = gpData.Validation, - Description = gpData.Description, - Key = Guid.NewGuid() - }; - //gpData.Tab == 0 Generic Properties / No Group - if (gpData.Tab == 0) - { - contentTypeItem.AddPropertyType(propertyType); - } - else - { - //Find the PropertyGroup by its Id and then set the PropertyType on that group - var existing = contentTypeItem.CompositionPropertyGroups.FirstOrDefault(x => x.Id == gpData.Tab); - if (existing != null) - { - contentTypeItem.AddPropertyType(propertyType, existing.Name); - } - else - { - // if the tab we picked is gone, re-create it - var tab = gpData.Tabs.FirstOrDefault(x => x.Id == gpData.Tab); - if (tab != null) - { - var caption = tab.GetRawCaption(); - contentTypeItem.AddPropertyType(propertyType, caption); - } - } - } - gpData.Clear(); - } - else - { - e.Message = ui.Text("contentTypeDublicatePropertyType", Security.CurrentUser); - e.IconType = BasePage.speechBubbleIcon.warning; - } - } - } - - private void UpdatePropertyTypes(IContentTypeComposition contentTypeItem) - { - //Loop through the _genericProperties ArrayList and update all existing PropertyTypes - foreach (GenericPropertyWrapper gpw in _genericProperties) - { - if (gpw.PropertyType == null) continue; - if (contentTypeItem.PropertyTypes == null || contentTypeItem.PropertyTypes.Any(x => x.Alias == gpw.PropertyType.Alias) == false) continue; - var propertyType = contentTypeItem.PropertyTypes.First(x => x.Alias == gpw.PropertyType.Alias); - if (propertyType == null) continue; - var dataTypeDefinition = ApplicationContext.Current.Services.DataTypeService.GetDataTypeDefinitionById(gpw.GenricPropertyControl.Type); - // when saving, respect user's casing, so do nothing here as propertyType takes care of it - propertyType.Alias = gpw.GenricPropertyControl.Alias; - propertyType.Name = gpw.GenricPropertyControl.Name; - propertyType.Description = gpw.GenricPropertyControl.Description; - propertyType.ValidationRegExp = gpw.GenricPropertyControl.Validation; - propertyType.Mandatory = gpw.GenricPropertyControl.Mandatory; - propertyType.DataTypeDatabaseType = dataTypeDefinition.DatabaseType; - propertyType.DataTypeDefinitionId = dataTypeDefinition.Id; - propertyType.PropertyEditorAlias = dataTypeDefinition.PropertyEditorAlias; - - if (propertyType.PropertyGroupId == null - || propertyType.PropertyGroupId.Value != gpw.GenricPropertyControl.Tab) - { - if (gpw.GenricPropertyControl.Tab == 0) - { - // moving to generic properties - propertyType.PropertyGroupId = new Lazy(() => 0); - } - else if (contentTypeItem.PropertyGroups.Any(x => x.Id == gpw.GenricPropertyControl.Tab)) - { - // moving to a tab that is local to the content type - propertyType.PropertyGroupId = new Lazy(() => gpw.GenricPropertyControl.Tab); - } - else - { - // moving to a tab that is not local, ie an inherited tab - // get the tab from the composition tabs, just so we have its name, - // and add the property with that tab name, and this will create the local tab - var propertyGroup = contentTypeItem.CompositionPropertyGroups.First(x => x.Id == gpw.GenricPropertyControl.Tab); - contentTypeItem.AddPropertyGroup(propertyGroup.Name); - contentTypeItem.MovePropertyType(propertyType.Alias, propertyGroup.Name); - } - } - } - - //Update the SortOrder of the PropertyTypes - foreach (HtmlInputHidden propSorter in _sortLists) - { - if (propSorter.Value.Trim() != "") - { - string[] newSortOrders = propSorter.Value.Split("&".ToCharArray()); - for (int i = 0; i < newSortOrders.Length; i++) - { - var propertyTypeId = int.Parse(newSortOrders[i].Split("=".ToCharArray())[1]); - if (contentTypeItem.PropertyTypes != null && - contentTypeItem.PropertyTypes.Any(x => x.Id == propertyTypeId)) - { - var propertyType = contentTypeItem.PropertyTypes.First(x => x.Id == propertyTypeId); - propertyType.SortOrder = i; - } - } - } - } - } - - private bool DoesPropertyTypeAliasExist(GenericProperty gpData) - { - bool hasAlias = _contentType.getPropertyType(Casing.SafeAliasWithForcingCheck(gpData.Alias.Trim())) != null; - ContentType ct = _contentType; - while (ct.MasterContentType > 0) - { - ct = new ContentType(ct.MasterContentType); - hasAlias = ct.getPropertyType(Casing.SafeAliasWithForcingCheck(gpData.Alias.Trim())) != null; - } - return !hasAlias; - } - - /// - /// Called asynchronously in order to delete a content type property - /// - /// - /// - /// - /// - /// - private IAsyncResult BeginAsyncDeleteOperation(object sender, EventArgs e, AsyncCallback cb, object state) - { - Trace.Write("ContentTypeControlNew", "Start async operation"); - - //get the args from the async state - var args = (DeleteAsyncState)state; - - //start the task - var result = _asyncDeleteTask.BeginInvoke(args, cb, args); - return result; - } - - /// - /// Occurs once the async database delete operation has completed - /// - /// - /// - /// This updates the UI elements - /// - private void EndAsyncDeleteOperation(IAsyncResult ar) - { - Trace.Write("ContentTypeControlNew", "ending async operation"); - - // reload content type (due to caching) - LoadContentType(_contentType.Id); - BindDataGenericProperties(true); - - Trace.Write("ContentTypeControlNew", "async operation ended"); - - //complete it - _asyncDeleteTask.EndInvoke(ar); - } - - /// - /// Removes a PropertyType from the current ContentType when user clicks "red x" - /// - /// - /// - protected void gpw_Delete(object sender, EventArgs e) - { - var state = new DeleteAsyncState( - UmbracoContext, - (GenericPropertyWrapper)sender); - - //Add the async operation to the page - //NOTE: Must pass in a null and do not pass in a true to the 'executeInParallel', this is changed in .net 4.5 for the better, otherwise you'll get a ysod. - Page.RegisterAsyncTask(new PageAsyncTask(BeginAsyncDeleteOperation, EndAsyncDeleteOperation, null, state)); - - //create the save task to be executed async - _asyncDeleteTask = asyncState => - { - Trace.Write("ContentTypeControlNew", "executing task"); - - //we need to re-set the UmbracoContext since it will be nulled and our cache handlers need it - global::Umbraco.Web.UmbracoContext.Current = asyncState.UmbracoContext; - - //if (_contentType.ContentTypeItem is IContentType - // || _contentType.ContentTypeItem is IMediaType - // || _contentType.ContentTypeItem is IMemberType) - //{ - _contentType.ContentTypeItem.RemovePropertyType(asyncState.GenericPropertyWrapper.PropertyType.Alias); - _contentType.Save(); - //} - //else - //{ - // //if it is not a document type or a media type, then continue to call the legacy delete() method. - // //the new API for document type and media type's will ensure that the data is removed correctly and that - // //the cache is flushed correctly (using events). If it is not one of these types, we'll rever to the - // //legacy operation (... like for members i suppose ?) - // asyncState.GenericPropertyWrapper.GenricPropertyControl.PropertyType.delete(); - - //} - - Trace.Write("ContentTypeControlNew", "task completing"); - }; - - //execute the async tasks - Page.ExecuteRegisteredAsyncTasks(); - } - - #endregion - - #region "Tab" Pane - - private void SetupTabPane() - { - uicontrols.TabPage tp = TabView1.NewTabPage("Tabs"); - tp.Controls.Add(pnlTab); - BindTabs(); - } - - private IEnumerable> SaveTabs() - { - var tabs = new List>();//TabId, TabName, TabSortOrder - foreach (DataGridItem dgi in dgTabs.Items) - { - int tabid = int.Parse(dgi.Cells[0].Text); - string tabName = ((TextBox) dgi.FindControl("txtTab")).Text; - int tabSortOrder; - if (Int32.TryParse(((TextBox)dgi.FindControl("txtSortOrder")).Text, out tabSortOrder)) - { - tabs.Add(new Tuple(tabid, tabName, tabSortOrder)); - } - } - return tabs; - } - - private void BindTabs() - { - DataTable dt = new DataTable(); - dt.Columns.Add("name"); - dt.Columns.Add("id"); - dt.Columns.Add("order"); - - // working on the LOCAL groups only... - // and I guess the ParentId thing was to prevent renaming inherited tabs?! - // nothing makes sense here - foreach (var grp in _contentType.PropertyTypeGroups.OrderBy(p => p.SortOrder)) - { - if (grp.ContentTypeId == _contentType.Id /*&& grp.ParentId == 0*/) - { - DataRow dr = dt.NewRow(); - dr["name"] = grp.Name; - dr["id"] = grp.Id; - dr["order"] = grp.SortOrder; - dt.Rows.Add(dr); - } - } - - if (dt.Rows.Count == 0) - { - lttNoTabs.Text = "No custom tabs defined"; - dgTabs.Visible = false; - } - else - { - lttNoTabs.Text = ""; - dgTabs.Visible = true; - } - dgTabs.DataSource = dt; - dgTabs.DataBind(); - } - - public DataTable DataTypeTable - { - get - { - if (_dataTypeTable == null) - { - _dataTypeTable = new DataTable(); - _dataTypeTable.Columns.Add("name"); - _dataTypeTable.Columns.Add("id"); - - foreach (var dataType in cms.businesslogic.datatype.DataTypeDefinition.GetAll()) - { - DataRow dr = _dataTypeTable.NewRow(); - dr["name"] = dataType.Text; - dr["id"] = dataType.Id.ToString(); - _dataTypeTable.Rows.Add(dr); - } - } - return _dataTypeTable; - } - } - - public DataTable TabTable - { - get - { - if (dgTabs.DataSource == null) - BindTabs(); - - DataTable dt = new DataTable(); - dt.Columns.Add("name"); - dt.Columns.Add("id"); - - foreach (DataRow dr in ((DataTable)dgTabs.DataSource).Rows) - { - DataRow dr2 = dt.NewRow(); - dr2["name"] = dr["name"]; - dr2["id"] = dr["id"]; - dt.Rows.Add(dr2); - } - - DataRow dr1 = dt.NewRow(); - dr1["name"] = "General properties"; - dr1["id"] = 0; - dt.Rows.Add(dr1); - - return dt; - } - } - - /// - /// Adds a new Tab to current ContentType when user clicks 'New Tab'-button - /// - /// - /// - protected void btnNewTab_Click(object sender, EventArgs e) - { - if (txtNewTab.Text.Trim() != "") - { - //if (_contentType.ContentTypeItem is IContentType - // || _contentType.ContentTypeItem is IMediaType - // || _contentType.ContentTypeItem is IMemberType) - //{ - _contentType.ContentTypeItem.AddPropertyGroup(txtNewTab.Text); - _contentType.Save(); - //} - //else - //{ - // _contentType.AddVirtualTab(txtNewTab.Text); - //} - - LoadContentType(); - - var ea = new SaveClickEventArgs(ui.Text("contentTypeTabCreated", Security.CurrentUser)); - ea.IconType = BasePage.speechBubbleIcon.success; - - RaiseBubbleEvent(new object(), ea); - - txtNewTab.Text = ""; - - BindTabs(); - BindDataGenericProperties(true); - } - - } - - /// - /// Removes a Tab from current ContentType when user clicks Delete button - /// - /// - /// - protected void dgTabs_ItemCommand(object source, DataGridCommandEventArgs e) - { - if (e.CommandName == "Delete") - { - int propertyGroupId = int.Parse(e.Item.Cells[0].Text); - //if (_contentType.ContentTypeItem is IContentType - // || _contentType.ContentTypeItem is IMediaType - // || _contentType.ContentTypeItem is IMemberType) - //{ - var propertyGroup = _contentType.ContentTypeItem.PropertyGroups.FirstOrDefault(x => x.Id == propertyGroupId); - if (propertyGroup != null && string.IsNullOrEmpty(propertyGroup.Name) == false) - { - // use RemovePropertyGroup so properties become generic - _contentType.ContentTypeItem.RemovePropertyGroup(propertyGroup.Name); - _contentType.Save(); - } - //} - - _contentType.DeleteVirtualTab(propertyGroupId); - - LoadContentType(); - - var ea = new SaveClickEventArgs(ui.Text("contentTypeTabDeleted", Security.CurrentUser)); - ea.IconType = BasePage.speechBubbleIcon.success; - - RaiseBubbleEvent(new object(), ea); - - } - - BindTabs(); - BindDataGenericProperties(true); - } - - protected void dgTabs_itemdatabound(object sender, DataGridItemEventArgs e) - { - if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) - { - ((DropDownList)e.Item.FindControl("dllTab")).SelectedValue = - ((DataRowView)e.Item.DataItem).Row["propertyTypeGroupId"].ToString(); - ((DropDownList)e.Item.FindControl("ddlType")).SelectedValue = - ((DataRowView)e.Item.DataItem).Row["type"].ToString(); - } - - } - - #endregion - - /// - /// TabView1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.TabView TabView1; - - /// - /// pnlGeneral control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel pnlGeneral; - - /// - /// pnlTab control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel pnlTab; - - /// - /// PaneTabsInherited control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane PaneTabsInherited; - - /// - /// tabsMasterContentTypeName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal tabsMasterContentTypeName; - - /// - /// Pane2 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane2; - - /// - /// pp_newTab control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_newTab; - - protected global::umbraco.uicontrols.PropertyPanel pp_isContainer; - protected global::System.Web.UI.WebControls.CheckBox cb_isContainer; - - /// - /// txtNewTab control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtNewTab; - - /// - /// btnNewTab control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button btnNewTab; - - /// - /// Pane1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane1; - - /// - /// dgTabs control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DataGrid dgTabs; - - /// - /// lttNoTabs control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal lttNoTabs; - - /// - /// pnlInfo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel pnlInfo; - - /// - /// Pane3 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane3; - - /// - /// pp_name control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_name; - - /// - /// txtName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtName; - - /// - /// RequiredFieldValidator1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1; - - /// - /// pp_alias control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_alias; - - /// - /// txtAlias control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtAlias; - - /// - /// pp_icon control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_icon; - - /// - /// ddlIcons control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.HiddenField tb_icon; - protected global::System.Web.UI.WebControls.Literal lt_icon; - - - /// - /// pp_description control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_description; - - /// - /// description control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox description; - - /// - /// pnlStructure control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel pnlStructure; - - /// - /// Pane6 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane6; - - /// - /// pp_Root control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_Root; - - /// - /// allowAtRoot control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBox allowAtRoot; - - /// - /// Pane5 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane5; - - /// - /// pp_allowedChildren control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_allowedChildren; - - /// - /// lstAllowedContentTypes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBoxList lstAllowedContentTypes; - - /// - /// PlaceHolderAllowedContentTypes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.PlaceHolder PlaceHolderAllowedContentTypes; - - /// - /// pnlProperties control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel pnlProperties; - - /// - /// PanePropertiesInherited control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane PanePropertiesInherited; - - /// - /// propertiesMasterContentTypeName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal propertiesMasterContentTypeName; - - /// - /// Pane4 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane4; - - /// - /// PropertyTypeNew control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.PlaceHolder PropertyTypeNew; - - /// - /// PropertyTypes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.PlaceHolder PropertyTypes; - - /// - /// checkTxtAliasJs control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal checkTxtAliasJs; - - /// - /// DuplicateAliasValidator control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CustomValidator DuplicateAliasValidator; - - /// - /// Pane9 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane9; - - /// - /// pp_compositions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel pp_compositions; - - /// - /// lstContentTypeCompositions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBoxList lstContentTypeCompositions; - - /// - /// PlaceHolderContentTypeCompositions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.PlaceHolder PlaceHolderContentTypeCompositions; - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs deleted file mode 100644 index bffdb8b475..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericProperty.ascx.cs +++ /dev/null @@ -1,456 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Web; -using System.Web.Mvc; -using System.Web.Routing; -using System.Web.UI.WebControls; -using ClientDependency.Core; -using umbraco.BasePages; -using umbraco.BusinessLogic; -using umbraco.cms.businesslogic; -using umbraco.cms.businesslogic.propertytype; -using Umbraco.Core; -using Umbraco.Core.Configuration; - -namespace umbraco.controls.GenericProperties -{ - /// - /// Summary description for GenericProperty. - /// - [ClientDependency(ClientDependencyType.Css, "GenericProperty/genericproperty.css", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "GenericProperty/genericproperty.js", "UmbracoClient")] - public partial class GenericProperty : System.Web.UI.UserControl - { - - /// - /// Constructor - /// - public GenericProperty() - { - FullId = ""; - AllowPropertyEdit = true; - } - - private cms.businesslogic.datatype.DataTypeDefinition[] _dataTypeDefinitions; - private int _tabId = 0; - - public event EventHandler Delete; - - /// - /// Defines whether the property can be edited in the UI - /// - [Obsolete("Use the combination of AllowAliasEdit,AllowValidationEdit,AllowDelete,AllowDataTypeEdit instead")] - public bool AllowPropertyEdit - { - get { return AllowAliasEdit && AllowValidationEdit && AllowDelete && AllowDataTypeEdit; } - set { AllowAliasEdit = AllowValidationEdit = AllowDelete = AllowDataTypeEdit = true; } - } - - /// - /// Defines whether the property's name can be edited in the UI - /// - public bool AllowNameEdit { get; set; } - public bool AllowAliasEdit { get; set; } - public bool AllowDataTypeEdit { get; set; } - public bool AllowTabEdit { get; set; } - public bool AllowValidationEdit { get; set; } - public bool AllowDescriptionEdit { get; set; } - public bool AllowDelete { get; set; } - - public cms.businesslogic.datatype.DataTypeDefinition[] DataTypeDefinitions - { - set { _dataTypeDefinitions = value; } - } - - public int TabId - { - set { _tabId = value; } - } - - public PropertyType PropertyType { get; set; } - - public ContentType.TabI[] Tabs { get; set; } - - public string Name - { - get { return tbName.Text; } - } - - public string Alias - { - get { return tbAlias.Text; } // FIXME so we blindly trust the UI for safe aliases?! - } - - public string Description - { - get { return tbDescription.Text; } - } - public string Validation - { - get { return tbValidation.Text; } - } - public bool Mandatory - { - get { return checkMandatory.Checked; } - } - public int Tab - { - get { return int.Parse(ddlTab.SelectedValue); } - } - - public string FullId { get; set; } - - public int Id { get; set; } - - public int Type - { - get { return int.Parse(ddlTypes.SelectedValue); } - } - - public void Clear() - { - tbName.Text = ""; - tbAlias.Text = ""; - tbValidation.Text = ""; - tbDescription.Text = ""; - ddlTab.SelectedIndex = 0; - SetDefaultDocumentTypeProperty(); - checkMandatory.Checked = false; - } - - protected void Page_Load(object sender, System.EventArgs e) - { - if (!IsPostBack) - { - UpdateInterface(); - } - } - - //SD: this is temporary in v4, in v6 we have a proper user control hierarchy - //containing this property. - //this is required due to this issue: http://issues.umbraco.org/issue/u4-493 - //because we need to execute some code in async but due to the localization - //framework requiring an httpcontext.current, it will not work. - //http://issues.umbraco.org/issue/u4-2143 - //so, we are going to make a property here and ensure that the basepage has - //resolved the user before we execute the async task so that in this method - //our calls to ui.text will include the current user and not rely on the - //httpcontext.current. This also makes it perform better: - // http://issues.umbraco.org/issue/U4-2142 - private User CurrentUser - { - get { return ((BasePage)Page).getUser(); } - } - - public void UpdateInterface() - { - // Name and alias - if (PropertyType != null) - { - Id = PropertyType.Id; - //form.Attributes.Add("style", "display: none;"); - tbName.Text = PropertyType.GetRawName(); - tbAlias.Text = PropertyType.Alias; - FullHeader.Text = PropertyType.GetRawName() + " (" + PropertyType.Alias + "), Type: " + PropertyType.DataTypeDefinition.Text; ; - Header.Text = PropertyType.GetRawName(); - - DeleteButton.CssClass = "delete-button"; - DeleteButton.Attributes.Add("onclick", "return confirm('" + ui.Text("areyousure", CurrentUser) + "');"); - - DeleteButton2.CssClass = "delete-button"; - DeleteButton2.Attributes.Add("onclick", "return confirm('" + ui.Text("areyousure", CurrentUser) + "');"); - - DeleteButton.Visible = AllowDelete; - DeleteButton2.Visible = AllowDelete; - - //alias visibility - PropertyPanel2.Visible = AllowAliasEdit; - //chk mandatory visibility - PropertyPanel5.Visible = AllowValidationEdit; - // validation visibility - PropertyPanel6.Visible = AllowValidationEdit; - // drop down data types visibility - PropertyPanel3.Visible = AllowDataTypeEdit; - // name visibility - PropertyPanel1.Visible = AllowNameEdit; - // desc visibility - PropertyPanel7.Visible = AllowDescriptionEdit; - } - else - { - // Add new header - FullHeader.Text = "Click here to add a new property"; - Header.Text = "Create new property"; - - // Hide image button - DeleteButton.Visible = false; - DeleteButton2.Visible = false; - } - validationLink.NavigateUrl = "#"; - validationLink.Attributes["onclick"] = ClientTools.Scripts.OpenModalWindow("dialogs/regexWs.aspx?target=" + tbValidation.ClientID, "Search for regular expression", 600, 500) + ";return false;"; - - // Data type definitions - if (_dataTypeDefinitions != null) - { - ddlTypes.Items.Clear(); - var itemSelected = false; - foreach (cms.businesslogic.datatype.DataTypeDefinition dt in _dataTypeDefinitions) - { - var li = new ListItem(dt.Text, dt.Id.ToString(CultureInfo.InvariantCulture)); - if ((PropertyType != null && PropertyType.DataTypeDefinition.Id == dt.Id)) - { - li.Selected = true; - itemSelected = true; - } - - ddlTypes.Items.Add(li); - } - - // If item not selected from previous edit or load, set to default according to settings - if (!itemSelected) - { - SetDefaultDocumentTypeProperty(); - } - } - - // tabs - if (Tabs != null) - { - ddlTab.Items.Clear(); - for (int i = 0; i < Tabs.Length; i++) - { - ListItem li = new ListItem(Tabs[i].Caption, Tabs[i].Id.ToString()); - if (Tabs[i].Id == _tabId) - li.Selected = true; - ddlTab.Items.Add(li); - } - } - ListItem liGeneral = new ListItem("Generic Properties", "0"); - if (_tabId == 0) - liGeneral.Selected = true; - ddlTab.Items.Add(liGeneral); - - // mandatory - if (PropertyType != null && PropertyType.Mandatory) - checkMandatory.Checked = true; - - // validation - if (PropertyType != null && string.IsNullOrEmpty(PropertyType.ValidationRegExp) == false) - tbValidation.Text = PropertyType.ValidationRegExp; - - // description - if (PropertyType != null && PropertyType.Description != "") - tbDescription.Text = PropertyType.GetRawDescription(); - } - - private void SetDefaultDocumentTypeProperty() - { - var itemToSelect = ddlTypes.Items.Cast() - .FirstOrDefault(item => item.Text.ToLowerInvariant() == UmbracoConfig.For.UmbracoSettings().Content.DefaultDocumentTypeProperty.ToLowerInvariant()); - - if (itemToSelect != null) - { - itemToSelect.Selected = true; - } - else - { - ddlTypes.SelectedIndex = -1; - } - } - - protected void defaultDeleteHandler(object sender, EventArgs e) - { - - } - - override protected void OnInit(EventArgs e) - { - base.OnInit(e); - - DeleteButton.Click += DeleteButton_Click; - DeleteButton2.Click += DeleteButton2_Click; - Delete += defaultDeleteHandler; - - // [ClientDependency(ClientDependencyType.Javascript, "js/UmbracoCasingRules.aspx", "UmbracoRoot")] - var loader = ClientDependency.Core.Controls.ClientDependencyLoader.GetInstance(new HttpContextWrapper(Context)); - var helper = new UrlHelper(new RequestContext(new HttpContextWrapper(Context), new RouteData())); - loader.RegisterDependency(helper.GetCoreStringsControllerPath() + "ServicesJavaScript", ClientDependencyType.Javascript); - } - - void DeleteButton2_Click(object sender, EventArgs e) - { - Delete(this, new EventArgs()); - } - - void DeleteButton_Click(object sender, EventArgs e) - { - Delete(this, new EventArgs()); - } - - /// - /// DeleteButton2 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.LinkButton DeleteButton2; - - /// - /// FullHeader control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal FullHeader; - - /// - /// DeleteButton control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.LinkButton DeleteButton; - - /// - /// Header control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal Header; - - /// - /// tbName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox tbName; - - /// - /// PropertyPanel1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel PropertyPanel1; - - /// - /// tbAlias control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox tbAlias; - - /// - /// PropertyPanel2 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel PropertyPanel2; - - /// - /// ddlTypes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlTypes; - - /// - /// PropertyPanel3 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel PropertyPanel3; - - /// - /// ddlTab control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlTab; - - /// - /// PropertyPanel4 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel PropertyPanel4; - - /// - /// checkMandatory control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBox checkMandatory; - - /// - /// PropertyPanel5 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel PropertyPanel5; - - /// - /// tbValidation control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox tbValidation; - - /// - /// validationLink control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.HyperLink validationLink; - - /// - /// PropertyPanel6 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.PropertyPanel PropertyPanel6; - - /// - /// tbDescription control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox tbDescription; - - protected global::umbraco.uicontrols.PropertyPanel PropertyPanel7; - - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericPropertyWrapper.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericPropertyWrapper.cs deleted file mode 100644 index b76bfe452f..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/GenericProperties/GenericPropertyWrapper.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using Umbraco.Core.IO; -using umbraco.cms.businesslogic.propertytype; - -namespace umbraco.controls.GenericProperties -{ - /// - /// Summary description for GenericPropertyWrapper. - /// - public class GenericPropertyWrapper : System.Web.UI.WebControls.PlaceHolder - { - private readonly bool _allowNameEdit = true; - private readonly bool _allowDataTypeEdit = true; - private readonly bool _allowAliasEdit = true; - private readonly bool _allowTabEdit = true; - private readonly bool _allowValidationEdit = true; - private readonly bool _allowDescEdit = true; - private readonly bool _allowDelete = true; - - private GenericProperty _gp; - private cms.businesslogic.ContentType.TabI[] _tabs; - private cms.businesslogic.datatype.DataTypeDefinition[] _dtds; - private int _tabId; - private string _fullId = ""; - - public event EventHandler Delete; - - public PropertyType PropertyType { get; set; } - - public int TabId - { - set { _tabId = value; } - } - - public cms.businesslogic.datatype.DataTypeDefinition[] DataTypeDefinitions - { - set { _dtds = value; } - } - - public cms.businesslogic.web.DocumentType.TabI[] Tabs - { - set { _tabs = value; } - } - - public string FullId - { - set { _fullId = value; } - } - - public GenericProperty GenricPropertyControl - { - get { return _gp; } - } - - public GenericPropertyWrapper() - : this(true) - { - - } - - public GenericPropertyWrapper(bool allowModification) - { - if (allowModification == false) - { - _allowAliasEdit = false; - _allowValidationEdit = false; - _allowDelete = false; - _allowDataTypeEdit = false; - } - } - - public GenericPropertyWrapper(bool allowNameEdit, bool allowDataTypeEdit, bool allowAliasEdit, bool allowTabEdit, bool allowValidationEdit, bool allowDescEdit, bool allowDelete) - { - _allowNameEdit = allowNameEdit; - _allowDataTypeEdit = allowDataTypeEdit; - _allowAliasEdit = allowAliasEdit; - _allowTabEdit = allowTabEdit; - _allowValidationEdit = allowValidationEdit; - _allowDescEdit = allowDescEdit; - _allowDelete = allowDelete; - } - - public void UpdateEditControl() - { - if (Controls.Count == 1) - { - var u = Controls[0]; - u.ID = ID + "_control"; - _gp = (GenericProperty)u; - _gp.PropertyType = PropertyType; - _gp.DataTypeDefinitions = _dtds; - _gp.Tabs = _tabs; - _gp.TabId = _tabId; - _gp.FullId = _fullId; - } - } - - protected void GenericPropertyWrapper_Delete(object sender, EventArgs e) - { - Delete(this, new EventArgs()); - } - - protected override void OnInit(EventArgs e) - { - base.OnInit(e); - var u = (GenericProperty)Page.LoadControl(SystemDirectories.Umbraco + "/controls/genericProperties/GenericProperty.ascx"); - - u.AllowAliasEdit = _allowAliasEdit; - u.AllowDataTypeEdit = _allowDataTypeEdit; - u.AllowDelete = _allowDelete; - u.AllowDescriptionEdit = _allowDescEdit; - u.AllowNameEdit = _allowNameEdit; - u.AllowTabEdit = _allowTabEdit; - u.AllowValidationEdit = _allowValidationEdit; - - u.ID = ID + "_control"; - - if (_allowDelete) - { - u.Delete += GenericPropertyWrapper_Delete; - } - - u.FullId = _fullId; - Controls.Add(u); - UpdateEditControl(); - } - - - } -} diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx deleted file mode 100644 index eb9cc90070..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx +++ /dev/null @@ -1,35 +0,0 @@ - -<%@ Page language="c#" MasterPageFile="../masterpages/umbracoPage.Master" Codebehind="EditMemberType.aspx.cs" AutoEventWireup="True" Inherits="umbraco.cms.presentation.members.EditMemberType" %> -<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> -<%@ Register TagPrefix="uc1" TagName="ContentTypeControlNew" Src="../controls/ContentTypeControlNew.ascx" %> -<%@ Register Namespace="umbraco" TagPrefix="umb" Assembly="umbraco" %> - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.cs deleted file mode 100644 index c4ca7ba095..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; -using ClientDependency.Core; -using umbraco.cms.businesslogic.member; -using umbraco.cms.presentation.Trees; -using umbraco.controls; - -namespace umbraco.cms.presentation.members -{ - public partial class EditMemberType : BasePages.UmbracoEnsuredPage - { - - public EditMemberType() - { - CurrentApp = BusinessLogic.DefaultApps.member.ToString(); - - } - protected PlaceHolder plc; - private businesslogic.member.MemberType _memberType; - - protected ContentTypeControlNew ContentTypeControlNew1; - - protected override void OnInit(EventArgs e) - { - base.OnInit(e); - - ContentTypeControlNew1.SavingContentType += ContentTypeControlNew1_SavingContentType; - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - _memberType = new businesslogic.member.MemberType(int.Parse(Request.QueryString["id"])); - - ContentTypeControlNew1.InfoTabPage.Controls.Add(Pane1andmore); - - if (!IsPostBack) - { - SetupExtraEditorControls(); - - ClientTools - .SetActiveTreeType(TreeDefinitionCollection.Instance.FindTree().Tree.Alias) - .SyncTree(_memberType.Id.ToString(CultureInfo.InvariantCulture), false); - } - } - - protected override bool OnBubbleEvent(object source, EventArgs args) - { - var handled = false; - var eventArgs = args as SaveClickEventArgs; - if (eventArgs != null) - { - var e = eventArgs; - if (e.Message == "Saved") - { - SetupExtraEditorControls(); - - ClientTools - .ShowSpeechBubble(speechBubbleIcon.save, "Membertype saved", "") - .SyncTree(_memberType.Id.ToString(CultureInfo.InvariantCulture), true); - - } - else - { - ClientTools - .ShowSpeechBubble(e.IconType, e.Message, "") - .SyncTree(_memberType.Id.ToString(CultureInfo.InvariantCulture), true); - - } - handled = true; - } - - return handled; - } - - private void SetupExtraEditorControls() - { - var dt1 = new DataTable(); - dt1.Columns.Add("id"); - dt1.Columns.Add("name"); - dt1.Columns.Add("canedit"); - dt1.Columns.Add("canview"); - - //filter out the 'built-in' property types as we don't want to display these options for them - var builtIns = Umbraco.Core.Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); - var propTypes = _memberType.PropertyTypes.Where(x => builtIns.Contains(x.Alias) == false); - - foreach (var pt in propTypes) - { - var dr = dt1.NewRow(); - dr["name"] = pt.Name; - dr["id"] = pt.Id; - dt1.Rows.Add(dr); - } - dgEditExtras.DataSource = dt1; - dgEditExtras.DataBind(); - } - - /// - /// Executes some code before the member type is saved, this allows us to save the member can edit/member can view information - /// before the Save() command is executed. - /// - /// - void ContentTypeControlNew1_SavingContentType(businesslogic.ContentType e) - { - var mt = e as MemberType; - if (mt == null) return; //This should not happen! - foreach (DataGridItem dgi in dgEditExtras.Items) - { - if (dgi.ItemType == ListItemType.Item || dgi.ItemType == ListItemType.AlternatingItem) - { - var pt = cms.businesslogic.propertytype.PropertyType.GetPropertyType(int.Parse(dgi.Cells[0].Text)); - mt.setMemberCanEdit(pt, ((CheckBox)dgi.FindControl("ckbMemberCanEdit")).Checked); - mt.setMemberViewOnProfile(pt, ((CheckBox)dgi.FindControl("ckbMemberCanView")).Checked); - } - } - } - - protected void dgEditExtras_itemdatabound(object sender,DataGridItemEventArgs e) - { - if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) - { - var pt = cms.businesslogic.propertytype.PropertyType.GetPropertyType(int.Parse(((DataRowView)e.Item.DataItem).Row["id"].ToString())); - ((CheckBox)e.Item.FindControl("ckbMemberCanEdit")).Checked = _memberType.MemberCanEdit(pt); - ((CheckBox)e.Item.FindControl("ckbMemberCanView")).Checked = _memberType.ViewOnProfile(pt); - } - } - - } - - -} diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.designer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.designer.cs deleted file mode 100644 index f976022cbb..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberType.aspx.designer.cs +++ /dev/null @@ -1,34 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.3074 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace umbraco.cms.presentation.members { - - - public partial class EditMemberType { - - /// - /// Pane1andmore control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane1andmore; - - /// - /// dgEditExtras control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DataGrid dgEditExtras; - } -} diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx deleted file mode 100644 index ab35ae3a63..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx +++ /dev/null @@ -1,15 +0,0 @@ -<%@ Register TagPrefix="cc2" Namespace="umbraco.uicontrols" Assembly="controls" %> - -<%@ Page Language="c#" CodeBehind="EditMediaType.aspx.cs" MasterPageFile="../masterpages/umbracoPage.Master" - Async="true" AsyncTimeOut="300" - AutoEventWireup="True" Inherits="umbraco.cms.presentation.settings.EditMediaType" %> - -<%@ Register TagPrefix="uc1" TagName="ContentTypeControlNew" Src="../controls/ContentTypeControlNew.ascx" %> - - - - diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.cs deleted file mode 100644 index 93e060c01d..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using umbraco.cms.presentation.Trees; - -namespace umbraco.cms.presentation.settings -{ - /// - /// Summary description for EditMediaType. - /// - public partial class EditMediaType : BasePages.UmbracoEnsuredPage - { - public EditMediaType() - { - CurrentApp = BusinessLogic.DefaultApps.settings.ToString(); - } - - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - ClientTools - .SetActiveTreeType(TreeDefinitionCollection.Instance.FindTree().Tree.Alias) - .SyncTree("-1,init," + helper.Request("id"), false); - } - } - - protected override bool OnBubbleEvent(object source, EventArgs e) - { - if (e is controls.SaveClickEventArgs) - { - var sce = (controls.SaveClickEventArgs)e; - - if (sce.Message == "Saved") - { - ClientTools.ShowSpeechBubble(speechBubbleIcon.save, "Mediatype saved", "Mediatype was successfully saved"); - } - else if (sce.Message.Contains("Tab")) - { - ClientTools.ShowSpeechBubble(sce.IconType, sce.Message, ""); - } - else - { - ClientTools.ShowSpeechBubble(sce.IconType, sce.Message, ""); - } - - return true; - } - - return false; - } - - } -} diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.designer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.designer.cs deleted file mode 100644 index 3bf60caa2c..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditMediaType.aspx.designer.cs +++ /dev/null @@ -1,24 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace umbraco.cms.presentation.settings { - - - public partial class EditMediaType { - - /// - /// ContentTypeControlNew1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.UserControl ContentTypeControlNew1; - } -} diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditNodeTypeNew.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditNodeTypeNew.aspx.cs deleted file mode 100644 index 493bce0d48..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditNodeTypeNew.aspx.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.Web.UI.WebControls; -using umbraco.cms.presentation.Trees; -using umbraco.cms.businesslogic.web; -using System.Linq; -using umbraco.controls; -using Umbraco.Core; - -namespace umbraco.settings -{ - public partial class EditContentTypeNew : BasePages.UmbracoEnsuredPage - { - public EditContentTypeNew() - { - CurrentApp = BusinessLogic.DefaultApps.settings.ToString(); - } - - protected controls.ContentTypeControlNew ContentTypeControlNew1; - private DocumentType _dt; - - override protected void OnInit(EventArgs e) - { - ContentTypeControlNew1.DocumentTypeCallback = new Func(UpdateAllowedTemplates); - ContentTypeControlNew1.InfoTabPage.Controls.Add(tmpPane); - base.OnInit(e); - } - - protected void Page_Load(object sender, EventArgs e) - { - _dt = new DocumentType(int.Parse(Request.QueryString["id"])); - if (!Page.IsPostBack) - { - BindTemplates(); - - ClientTools - .SetActiveTreeType(TreeDefinitionCollection.Instance.FindTree().Tree.Alias) - .SyncTree("-1,init," + _dt.Path.Replace("-1,", ""), false); - } - } - - protected override bool OnBubbleEvent(object source, EventArgs args) - { - bool handled = false; - var eventArgs = args as SaveClickEventArgs; - if (eventArgs != null) - { - var e = eventArgs; - if (e.Message == "Saved") - { - ClientTools.ShowSpeechBubble(e.IconType, ui.Text("contentTypeSavedHeader"), ""); - - BindTemplates(); - } - else - { - ClientTools.ShowSpeechBubble(e.IconType, e.Message, ""); - } - handled = true; - } - return handled; - } - - protected void dgTemplate_itemdatabound(object sender, DataGridItemEventArgs e) - { - if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) - { - ((CheckBox)e.Item.FindControl("ckbAllowTemplate")).Checked = true; - } - } - - private DocumentType UpdateAllowedTemplates(DocumentType documentType) - { - var tmp = new ArrayList(); - - foreach (ListItem li in templateList.Items) - { - if (li.Selected) - tmp.Add(new cms.businesslogic.template.Template(int.Parse(li.Value))); - } - - var tt = new cms.businesslogic.template.Template[tmp.Count]; - for (int i = 0; i < tt.Length; i++) - { - tt[i] = (cms.businesslogic.template.Template)tmp[i]; - } - - documentType.allowedTemplates = tt; - - if (documentType.allowedTemplates.Length > 0 && ddlTemplates.SelectedIndex >= 0) - { - documentType.DefaultTemplate = int.Parse(ddlTemplates.SelectedValue); - } - else - { - documentType.RemoveDefaultTemplate(); - } - - _dt = documentType; - - return documentType; - } - - private void BindTemplates() - { - var templates = (from t in cms.businesslogic.template.Template.GetAllAsList() - join at in _dt.allowedTemplates on t.Id equals at.Id into at_l - from at in at_l.DefaultIfEmpty() - select new - { - Id = t.Id, - Name = t.Text, - Selected = at != null - }).ToList(); - - templateList.Items.Clear(); - templateList.Items.AddRange(templates.ConvertAll(item => - { - var li = new ListItem { Text = Server.HtmlEncode(item.Name), Value = item.Id.ToString(CultureInfo.InvariantCulture), Selected = item.Selected }; - return li; - }).ToArray()); - - - ddlTemplates.Enabled = templates.Any(); - ddlTemplates.Items.Clear(); - ddlTemplates.Items.Insert(0, new ListItem(ui.Text("choose") + "...", "0")); - ddlTemplates.Items.AddRange(templates.ConvertAll(item => - { - var li = new ListItem { Text = Server.HtmlEncode(item.Name), Value = item.Id.ToString(CultureInfo.InvariantCulture) }; - return li; - }).ToArray()); - - var ddlTemplatesSelect = ddlTemplates.Items.FindByValue(_dt.DefaultTemplate.ToString(CultureInfo.InvariantCulture)); - if (ddlTemplatesSelect != null) - ddlTemplatesSelect.Selected = true; - } - - /// - /// tmpPane control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane tmpPane; - - /// - /// templateList control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBoxList templateList; - - /// - /// ddlTemplates control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlTemplates; - } -}