1.0.0-alpha6 (2013-10-15)

TYPO3 Neos Alpha 6 contains lots of improvements, where most of them were incorporated at the code sprint at de-cix. in Frankfurt. Main highlights are improved content editing, Plugin Views, features in TypoScript, a new demo site, improved security and lots of bugfixes and stability improvements.

Some changes are breaking, but there is a code migration for many of them.

We’re aiming for another Alpha version before T3CON13DE, where we will announce the release date of the beta version, being planned for a few weeks after T3CON.

Read on for the most prominent changes!

Improved Content Editing

The page tree is now called “Navigate”, and it has been completely re-vamped. It allows to create, filter and search pages, and shows a structural view of the page as well.

We now include a Page Layout Selection mechanism in Neos, so the user can switch between different “templates” of a page. Furthermore, we now ship with a form content element based on TYPO3.Form, which can be used e.g. for contact or signup pages.

Additionally, Aloha is now configurable, being able to change the editing options a user has on a per-content-element basis.

Basic keyboard navigation support was added as well, so navigation and creating of content can now be triggered with keyboard shortcuts.

Stability was also improved: Especially, a long-standing bug related to moving nodes was fixed, the HTML editor can now work with inline JavaScript.

The Navigate Component (on the left side)
Filtering the page tree
Page Layout Selection

TypoScript Improvements

There were a few bigger changes to the way we handle TypoScript, because we learned from the first real-world implementations. While this includes some breaking changes, many sites will be easy to adjust to them:

Now, TypoScript Objects, Eel Expressions and simple values can be used interoperably: This means that e.g. every time you were using an Eel expression beforehand, you could also use a TypoScript object for the same task, and vice versa. This makes TypoScript more extensible and consistent.

Furthermore, we re-implemented processors with Eel and TypoScript, being able to reduce the number of concepts a user needs to learn. However, if you used processors in your site before, you need to rewrite them to Eel expressions or TypoScript objects.

For consistency reasons, we removed the ability to attach TypoScript to a particular page, so if you relied on this feature, you should rather use conditions now.

FlowQuery now has a find() operation which helps to search in a whole sub-tree, and this.* now references other properties at the same level in TypoScript, increasing the re-use of Eel expressions.

Finally, two TypoScript objects were modified: ContentCollection.Default was moved back to ContentCollection, and PrimaryContentCollection has been renamed to PrimaryContent. A code migration has been supplied to ease upgrading.

Plugin Views

Often, plugins have to be split up across multiple pages, e.g. showing the “list” view on the overview page, and then having a separate page (with a different layout) for the “detail” views. In order to make this as seamless as possible, we introduced plugin views: A plugin can define into which parts it can be split apart; and the user can then easily add different parts to different pages.

Furthermore there was one breaking change: Node properties are not passed as plugin arguments anymore, because this behavior was hard to understand and had some broken fallback logic attached to it. Instead, the node should be accessed directly from within the plugin.

New Demo Site

The demo site has been completely re-done from scratch, being fully responsive, serving as best-practice of how Neos is used, and showing many Neos features in detail.

We will continue to work on this in the next weeks.

The New Demo Site

Security

During the code sprint, a bigger Neos security audit took place: This resulted in creating many policies and implementing security measures, which are all merged into Neos now.

New Login Screen

The login screen has been adjusted to match the look and feel of Neos.

Increased Compatibility With Websites

As always, we’re striving to increase compatibility with arbitrary CSS and JavaScripts the site integrator might add to the website template. That’s why we prepended all Neos CSS with neos-, making it harder for websites to break the Neos user interface.

Additionally, we are now using data-attributes instead of custom script tags for storing editing information in the website, as this makes it a lot easier to customize the desired HTML output, and it reduces difficulties in working with JavaScript components such as sliders or carousels.

Furthermore, we were able to get rid of the .neos-reloadable-content marker class, making content reloading a lot more robust without any help needed by the site integrator.

Code Cleanups

Internally, we streamlined lots of PHP and JavaScript code, most notably we also updated to Ember 1.0.0 final.

Next Steps

One more alpha version will be released before T3CON13DE. A few weeks after T3CONDE, we will release the first Beta version.

Giving Feedback

We’re eager to hear your feedback on the release. You can reach us most easily using Twitter (#TYPO3Neos), IRC at irc://freenode.net/typo3-neos or just reach out to any team member of your choosing.

Full list of breaking changes

TYPO3.Neos

  • Security: Every controller action is now protected by default, this also includes actions and controllers of third party packages installed within a Neos distribution. To make them accessible again, you have to add a policy to the corresponding package or your site package and grant those actions to at least one role (e.g. “Everybody” or “TYPO3.Neos:Editor”)
  • Restructure page rendering for more flexibility: https://review.typo3.org/#/c/24563/ only breaking if you have overridden prototype(TYPO3.Neos:Page).templatePath
  • Remove automagic creation of ContentCollections on pages: https://review.typo3.org/#/c/24338/ This is breaking if you use more than the “main” section in your site. In this case you have to define those additional sections in the NodeTypes.yaml of your site package.
  • remove ContentCollection.Default and rename PrimaryContentCollection to PrimaryContent: https://review.typo3.org/#/c/24263/ please run the provided code migration
  • improve reloading of content without neos-reloadable-content: https://review.typo3.org/#/c/24300/ <neos:contentElement> does not have a reloadable-attribute anymore. Just remove it completely.
  • Introduce sanitation of content in Aloha editor: https://review.typo3.org/#/c/23545/
  • Node with object property breaks PluginImplementation: https://review.typo3.org/#/c/23279/
  • Remove usage of node based TypoScript: https://review.typo3.org/#/c/20861/ Use TypoScript conditions instead.
  • Upgrade Ember to 1.0.0: https://review.typo3.org/#/c/23700/ clear your browser cache and cookies.

TYPO3.TypoScript

  • re-implement Processors based on TypoScript Objects and Eel: https://review.typo3.org/#/c/24423/ if you used processors, see the above commit message for detailed upgrade instructions.

Detailed change log

Base Distribution

[TASK] Add installer scripts for package installs

Add configuration to manifest that calls scripts on every package install.

See also I06a2c5e35004f400291e7697c215bea8e685266b.

[TASK] Update vfsstream requirement to 1.2.*

This updates the requirement for mikey179/vfsstream from 1.1.* to 1.2.*.

TYPO3.Neos

[!!!][TASK] Make TYPO3.Neos.nodeTypes.groups extensible and sortable

This changes allows package authors to define their own nodeTypeGroups without having to overwrite the default settings. It also gets rid of the need for the integrator to redeclare every nodeTypeGroup in the Distributions Settings.yaml if he wants to add new ones.

The configuration of TYPO3.Neos.nodeTypes.groups changes to the following format:

TYPO3:
  Neos:
    nodeTypes:
      groups:
        general:
          position: 'start'
          label: 'General'
        structure:
          position: 100
          label: 'Structure'

This change is breaking because the “group” settings in the NodeTypes.yaml now has to use the key instead of the label and the Settings.yaml structure has changed.

[TASK] Remove evaluateProcessor from PluginImplementation

[!!!][TASK] Restructure page rendering for more flexibility

The page rendering now relies more on TypoScript to allow better possibilities to override parts of the page rendering without having to adapt a full template.

The rendering is structured like this now to have flexibility and at the same time not too deeply nested TypoScript paths

prototype(TYPO3.Neos:Page) now extends TYPO3.TypoScript:Array

The following properties can be adapted by integrators:

  • prototype(TYPO3.Neos:Page).doctype.value - full doctype string
  • prototype(TYPO3.Neos:Page).htmlTag - TYPO3.TypoScript:Tag
  • prototype(TYPO3.Neos:Page).headTag - TYPO3.TypoScript:Tag
  • prototype(TYPO3.Neos:Page).bodyTag - TYPO3.TypoScript:Tag

All three have the property “attributes” which is an array of attributes for the tag.

  • prototype(TYPO3.Neos:Page).head stays TYPO3.TypoScript:Array
  • prototype(TYPO3.Neos:Page).body stays TYPO3.Neos:Template

This change is only breaking if you rely on overwriting the PageTemplate (prototype(TYPO3.Neos:Page).templatePath). prototype(TYPO3.Neos:Page).body and prototype(TYPO3.Neos:Page).head still work as before. Additionally the variables “title” and “nodePath” for body are no longer predefined. You can of course define them in your TypoScript if needed.

[!!!][TASK] Add navigate component

This adds navigation functionality which includes the Node tree and Context structure tree.

[TASK] Remove enableAloha feature switch

Disabling Aloha will leave the user without content editing, to prevent that from happening we remove the feature switch for now.

[TASK] Remove PHP closing tag

[FEATURE] Sticky Menu button

This change introduces the sticky menu button into the Neos menu allowing for keeping the menu open with just the icons being visible.

[TASK] Add “use” for NodeInterface in MenuImplementation

Also add one missing typehint for NodeInterface

[TASK] Streamline FlowQueryOperation classes

[TASK] Add missing title attributes

This change adds some missing title attributes to UI components.

[TASK] Add missing @param annotation in PluginUriAspect

[FEATURE] Add removeCommand to UserCommandController

[TASK] Introduce “use” in NodeView and NodeController

[BUGFIX] Publish all always marks all nodes published

This change changes the publish all button to only mark all nodes published if the request returned a success status. If the publishing goes wrong a error notification is shown.

Also introduces a missing dependency.

[BUGFIX] Select boxes in collapsed inspector sections

If a inspector section is collapsed the custom selector boxes width is set to 0px, to prevent this we add width to 100% with !important to overwrite inline style.

[TASK] Add default files for install process

This adds a default Routes.yaml and .gitignore file to be installed during install / update of the package.

[TASK] Cookbook Example for Wrapping a List of Content Elements

Starting with a simple example for just wrap with a div to using a checkbox for adopting output via fluid.

[TASK] Add MenuRendering to IntegratorCookbook

This adds a MenuRendering documentatution part to the IntegratorCookbook which is written in english.

[TASK] adjustments to new processor syntax

[TASK] Add missing throws annotation in FrontendNodeRoutePartHandler

[BUGFIX] InlineEditableOverlay is not added to new HTML elements

The InlineEditableOverlay tries to read the NodeConfiguration for new nodes which currently fails. This configuration is only used for adding an icon to the overlay based on the content type.

As this feature isn’t used anymore, and not planned to enable again, we remove it in this change.

[BUGFIX] Retrigger javascript in submodule flash messages

When trying to close a flashmessage in a submodule by clicking on the X it redirects the user to domain/#. This is related to the renaming of Twitter Boostrap classes to be prepended by neos-.

By adding the alert class to flash messages the Twitter Boostrap javascript is triggered.

[FEATURE] Add possibility to change roles for users

[TASK] Remove wrong validate on EmailAddress in UserCommandController

[TASK] Disallow nodes in workspaces of other users

For this to achieve we restrict the node type converter to only allow create for nodes in the current user’s workspace or the live workspace.

[TASK] Disallow access to foreign workspaces

The workspace module currently allows to show, publish and discard workspaces of other users. Since we currently only have per user workspaces, this change disables the selection of other workspaces in the workspaces module controller so that only access to the workspace of the currently logged in user is possible.

[TASK] Use hasAccessToResource from access decision manager

[TASK] Backend users are only allowed to update their own user settings

[BUGFIX] Add missing policy rule for publishAll action

The change was merged after the policy introducion, but didn’t contain a matching policy since the change was created prior to merging of the policy change.

[TASK] Rename publishAllWorkspace method to publishAll

Also includes some minor CGL clean ups.

[TASK] Remove not used injects in SiteImportService

There are 3 injects which are not used. Remove them.

DomainRepository WorkspaceRepository PersistenceManagerInterface

[TASK] Remove not used “use” in NodeConverter

[TASK] Remove not used “use” in all Step classes

[TASK] Make use of the “use” for NodeInterface in PluginViewImplementation

[TASK] Update custom content element example code

The example code uses the ‘TYPO3.TypoScript:Template’ node type for prototyping instead of the ‘TYPO3.Neos:Template’ node type. This results in an exception as the ContentElementViewHelper expects a node as passed argument.

For consistency the change is done in all examples.

[TASK] Replace inject method to inject annotation in EditableViewHelper

[BUGFIX] Neos Icons should have a reseted margin

In the frontend you could define different css settings for your FontAwesome classes. Using a margin should not break the Neos Icons. Therefore a margin should be set for top, left, right and bottom.

[TASK] Adjust to refactoring of DatabaseConnectionException

[BUGFIX] add a save check for disabled selectbox options

Only if the disabled value is set to true it will actually be disabled. If a value is missing or it has any other value it will be active.

[BUGFIX] Clean up after direct push of new login design

[FEATURE] Implement new login screen design

New login screen design implementation.

[!!!][TASK] rename “class” to “className” in TYPO3.Neos:ContentCollection

… this is done to be consistent with the naming of the Template TypoScript objects.

While this is a breaking change, this feature has only been introduced a week ago at the code sprint, so except the new demosite nobody will use it yet.

[TASK] Remove unused “use” for TYPO3\TypoScript\Core\Runtime

[BUGFIX] Image upload fails with CSRF error

Fixes an issue with the image upload which failed uploading images after applying the new, more restrictive security policies. This change adds a CSRF token to the form sent by the image uploader and generally makes the current CSRF token available in the JavaScript Configuration object.

[TASK] Move Aloha to TYPO3.Neos

This change moves the Aloha files to the TYPO3.Neos package and updates the update scripts of the external dependencies accordingly.

[TASK] Remove unused injects in ContentCollectionImplementation

[TASK] remove empty newline after closing PHP tag in PublishingService

[BUGFIX] Small fix for Flexible Plugin

The Flexible Plugin Intergration doesn’t work correctly with only one plugin instance. And fix the Content-Type in ContentController.

[TASK] Integrator Cookbook Extending the page node type

[TASK] Integrator Cookbook Create a New Node Type

[TASK] Added some examples to the eel query cookbook.

[TASK] Missing jQuery in ContentCommands.js

[BUGFIX] Incorrect return type for publishing service getUnpublishedNodes

[BUGFIX] Publish content collections for all document types

Currently only Page document types have their content collections published automatically. This should be done for all document types instead.

[TASK] Fix debugmode settings in functional TS RenderingTest

[TASK] Remove not used “use” for NodeCreationException

Inside ContentController NodeCreationException is not used, so we can remove it.

[TASK] Remove not used AccountFactory in UserCommandController

[TASK] Remove not used NodeDataRepository in SitesController

[TASK] Remove not used NodeDataRepository in NodeController

[TASK] Add typehints to createRuntime in TypoScriptService

[TASK] Remove full class-path for NodeInterface in FindOperation

[!!!][TASK] Remove automagic creation of ContentCollections on pages

ContentCollections are no longer auto created on rendering of a page. Instead they need to be defined as childNodes of the Page Node. Neos predefines a “main” section by default which can be overriden or added to in the site package. Additionally you can of course create your own Document Type with a specific child node structure.

This is breaking if you use more than the “main” section in your site. In this case you have to define those additional sections in the NodeTypes.yaml of your site package.

[FEATURE] Add PluginService to Neos

The PluginService bundles various functions needed by Neos Plugins and PluginViews.

[BUGFIX] make sure that an empty content collection is not selfclosing

This fixes the regression that inside the backend, the content rendering is destroyed because a self-closing <div> is invalid HTML.

[TASK] Integrator Cookbook Adding a Simple Contact Form

Simple Step by Step How to create a Contact Form and insert it in the page.

[BUGFIX] fix functional tests

[!!!][BUGFIX] fix regression introduced with content collection CSS class additions

We need to make sure that the wrapping container for the content collection is outputted also if the user is not logged into the backend, in order to be sure that the markup structure is the same in Frontend and Backend.

This change is potentially breaking because it modifies the frontend DOM structure when not being logged in.

[BUGFIX] Add editAction to sites module policy resource

[FEATURE] make it possible to add custom classes to content collections

[BUGFIX] ContentElementHandles are rendered over modal dialogs

A regression has been introduced causing the ContentElementHandles to be rendered over the new content element dialog. This change sets the z-index higher of the handles higher then the modals.

[BUGFIX] Exclude fixtures from global Neos policy during tests

[!!!][BUGFIX] remove ContentCollection.Default and rename PrimaryContentCollection to PrimaryContent

Please run the code migration using ./flow core:migrate for adjusting that.

[FEATURE] allow a CSS class attribute in <neos:contentElement>

This is really helpful to create custom content elements for carousels and the like, being able to fine-tune the created markup in detail.

[TASK] Allow access to media management in content view

Make the Typo3BackendProvider responsible for the Media package and allow access to the TYPO3_Media_ManageAssets resource.

[TASK] Use generateSitePackage() to create site packages

[TASK] Grant widget controllers to “Everybody”

[BUGFIX] remove z-index on content elements, but rather place it on the content handles

[TASK] Remove unused Node Abstract from NodeView

See also change I8a5753bde3c2cf0ede003cae5279b8e2712cf2f1.

[TASK] Re-arrange order of content element handle actions

[TASK] Implement security policy

[TASK] Minor styling improvements for select boxes

[TASK] Apply migration TYPO3.Flow-201212051340

No change, but make sure to skip this migration in the future.

[TASK] Update the database connection error screen

The database connection error now warns for a connection error while the DatabaseConnectionException is also thrown if the database structure is not up to date. This change updates the error message and points to the logfile for further information.

[FEATURE] Cookbook: Creating a Plugin

Added content to the cookbook-chapter ‘Creating a Plugin’

The described command ‘flow kickstart:plugin ...’ can be found in I94378aa2c900e0ba5cb9b47d2980d9315ea858e8 (#24272)

[FEATURE] Add layout selection to pages

This adds a layout & subpages layout selector in the Inspector for TYPO3.Neos:Page node type. This can be used to alter the rendering of the page using TypoScript.

[TASK] add functional tests to FlowQuery

[!!!][FEATURE] improve reloading of content without neos-reloadable-content

This change removes the neos-reloadable-content CSS class, which was used to determine the sections which shall be reloaded. Now, we reload everything between #t3-page-metainformation (which is rendered directly after the body tag by the Neos PageTemplate.html) and #neos-application, which is rendered at the very end of the body by the same template.

This greatly improves the reloading experience, taking also changes to menu states, breadcrumb, and complete layout modifications into account.

Applying new CSS classes on <html> and <body> is not yet supported, though (but that did not work before this change, either).

This change is breaking because <neos:contentElement> does not have a reloadable-attribute anymore. Just remove these classes from your usages of <neos:contentElement>.

Make sure to check the corresponding changes as well.

[FEATURE] Add siblings operation for Nodes

The siblings operation fetches all nodes that are siblings of the given context node(s). The returned FlowQuery object will not contain the original nodes from the context but just the siblings. Filtering is possible as well.

The functionality is modelled after the jQuery siblings operation.

[TASK] Adjust to refactored route caching in Flow

[TASK] Clarify pasting of nodes

Previously the paste button always said “Paste after” even though it actually pastes into a content collection. This change introduces a new title property, so we actually have the correct one depending on the context and also removes the “after” from all methods and parameters as this is handled in the ContentCommands.

[BUGFIX] Remove unnecessary included template file

In the MenuPanelController a unnecessary template was included and not used.

[BUGFIX] Reintroduce modal backdrop for submodules modal

This reintroduces modal backdrop for submodule modal windows.

[BUGFIX] inline editables should preserve their content after applying changes in the inspector

Before this change, the following bug appeared:

  • you modified e.g. the text of the “Text” content element
  • then, for the same content element, you directly changed a property in the inspector (f.e. toggling “hidden”)
  • then, press apply.
  • This has reset the contents of the “Text” content element back to the initial value; losing all content changes.

The bug was that the inspector stored all properties of the node, and on apply, restored all of them. The bugfix is that the inspector only updates properties that were changed and not all of them on apply.

[BUGFIX] Auto publish stops working upon reload

This saves the state of the autoPublish checkbox in localStorage, so it is still there even if a reload happens.

[BUGFIX] Reintroduce mouse leave for menu button

When hovering on the menu button and then leaving it the menu panel is closed.

This behaviour was already in place before the Ember 1.0 update.

[FEATURE] use data-attributes for content elements

this greatly allows compatibility with e.g. sliders or more advanced JavaScript elements in the backend.

[TASK] Remove use of aloha:baseUri VH in PageHead.html

This replaces the aloha:baseUri VH with a uri.resource VH use.

[TASK] Neos uses the Flow package type filter

The logic to search for packages of a particular type or in a particular directory is now in TYPO3.Flow, so we can take advantage of the PackageManager’s convenience method getFilteredPackages().

This also tells the PackageManager where to put packages that are of type:

  • typo3-flow-site
  • typo3-flow-plugin

This depends on Ic87ebaece612e25898318795c748941e5a96b8cb

[BUGFIX] adjust “Plugin” TypoScript object to “this” changes

[!!!][TASK] Introduce sanitation of content in Aloha editor

This commit introduces a sanitation for inline edited content. The level is currently set to be relaxed but there is possibility for relaxed, basic and restricted.

In the commit there is also sanitation for pasted content from word, generic and oembed which is default configuration for Aloha.

[TASK] add basic structure for cookbooks

[FEATURE] Add basic keyboard navigation

[FEATURE] Allow Aloha Buttons to be configured via yaml settings

For each contentelement you can define properties.ui.aloha.* with an array. Supported are table, link, list, alignment, format.

[TASK] Add publish all button to publish menu

Introduces a publish all button to the publish menu dropdown. This is doing exactly what is says, publishing all in the current workspace.

[BUGFIX] Collection overlays are not added after node create / paste

The collection overlays that should make empty collections visible were not added when the collection was created or pasted. This happened because the CSS selector for detecting / removing was incorrect causing the removal of the overlay on the parent collection to remove the new overlay on the child collection.

[TASK] Remove unnecessary newlines from MenuPanel

[BUGFIX] Get the behat tests running green again

[TASK] Remove unused requirejs loading debug mechanism

We used this debugging mechanism when we still searched for the right inclusion order in requirejs. This is in the meantime handled correctly, and the debugging isn’t used anymore.

Also fixes some minor CGL issues in storage.js

[FEATURE] Trigger externally observable events on important actions

Trigger custom events that external site-specific JavaScript can listen on whenever important events happen in Neos. Currently event are triggered on the following actions

  • PageReload
  • EnablePreview
  • DisablePreview
  • NodeSelected
  • NodeUnselected
  • ContentModuleLoaded
  • Resolves: #51367
  • Commit: 8c16d4f

[!!!][BUGFIX] Node with object property breaks PluginImplementation

Currently Neos PluginImplementation use the Request argument to pass the node properties. This work fine for simple type, but break with object. By using internal arguments, object can be passed with success.

This is a breaking change.

[BUGFIX] HTML editor should be able to edit inline JavaScript

  • shows inline java script correctly in html editor
  • inline java script is executed exactly once on apply
  • html added in inline editing is escaped

Think about: * if inline java script is broken, it breaks the backend * Resolves: #33010, #52387

[TASK] Update Chosen to 1.0

[BUGFIX] Inspector apply button is not visible

[!!!][TASK] Remove usage of node based TypoScript

TypoScript files are no longer searched in the subpath “Nodes”. The concept of TypoScript specific to a Node was abandoned in favor of a centralized TypoScript configuration. Any changes to the rendering based on nodes and node structure should be realized by using Matchers and EEL expressions in the central TypoScript.

[BUGFIX] Clear session storage if quota limit is reached

The session storage can reach it’s quota limit (5 MB) when the configuration has been cleared a lot during the same session, so to prevent a JavaScript error we clear the session storage.

[TASK] Remove duplicate license line in composer.json

[TASK] Linking to Nodes with given ContextNodePath

Giving a ContextNodePath that is an absolute path appended with the context, like “/sites/flowtypo3org/homepage@live”, correctly creates a link for this node, even without being inside a Neos environment and, therefore, without having access to the TypoScript environment which contains Node objects.

This makes interoperability between Flow applications and Neos easier as it allows you to render links from Flow applications without the needing to create a Node object.

[BUGFIX] Prevent error when menu data isn’t cached

[TASK] Add number of changes to publish menu button

Introduces the number of unpublished nodes to the publish menu button. This is to make it more visible for the user how many numbers of changes there is to be published

[TASK] Correct Fizzle docs about property paths

We don’t currently support property names with periods, though a period could be added to the Eel grammar at some point if someone needs it. The period is the only thing missing to support property paths, as FlowQuery already asks the ObjectManager to resolve the property paths that are matched.

Since no one is currently using this feature, we just correct the docs instead of fixing and testing the feature in TYPO3.Eel.

[TASK] Use get method on configuration

[TASK] Restructure JavaScript model objects

[!!!][TASK] Upgrade Ember to 1.0.0

Breaking due to requiring clearing of session storage.

[FEATURE] Implement date time editor

The current jQuery UI datepicker is replaced by a more lightweight version with time picking support. The datetimepicker uses a ‘shadow field’ so internal storage of the date is done in an internal format (US for now), and displaying is done in a format which could be user specific.

[BUGFIX] Prevent reselecting page node when already selected

This bug occurs when the page node is selected and a non-content element is clicked resulting in the inspector to be reinitialized.

[TASK] test cases for prototype inheritance

… depends on https://review.typo3.org/17573 to be merged

[BUGFIX] Make styled checkboxes work in Firefox

Since Firefox doesn’t render pseudo elements for self closing tags like input, we need to add a span after the input in order to style the checkbox.

[BUGFIX] Fix arrow alignment on inspector validation errors

[FEATURE] Support removing of images for image properties

This patch adds a remove button in the ImageEditor.

[TASK] Restructure user input event initialization

This change restructures the registration of keyboard and mouse events as a preparation on keyboard navigation and the extension of available keyboard shortcuts.

[TASK] Add hover state for menu button

This adds an open/close state to the menu button causing the menu panel to open on hovering over the menu button. The functionality is inspired from the Google Plus home menu.

[TASK] Change resource cache into an Ember object

[BUGFIX] Backend module overview is broken

Since the CSS classname prefix the backend module overview page styling is broken. This change fixes the styling.

[BUGFIX] Add missing neos- prefix to menu section collapse

[BUGFIX] Re-add default styling of icons

[TASK] Support importing of “huge” Sites.xml files

Adds the LIBXML_PARSEHUGE flag to SimpleXMLElement creation.

[BUGFIX] Create new document node modal is broken

Since the CSS classname prepend the modal for creating a new document node was broken as this template file still contains unprepended classes. This change prepends the missed classnames.

[BUGFIX] Thumbnails styling is missing from Neos

The thumbnails styling for Neos is removed as it wasn’t used in the TYPO3.Neos package, but it is used in TYPO3.Media.

This change adds the classes and prepends them with neos-.

[BUGFIX] Correct styling issues after CSS classname prepend

I5689792e0bbb68d798d3e22a5fa6edf292c74e58 introduced a few regressions.

This change fixes: * missing styling in the wireframe mode * breadcrumb in inspector does not open * broken module styling * Related: #52175

[BUGFIX] Fit upload image button into Inspector

[BUGFIX] _StyleWorkInProgress.scss contains invalid classnames

[FEATURE] Add shared sessionStorage component (like localStorage)

Also adds a internal property for caching the result of the functionality check to prevent unnecessary read/write to disk.

Clear session storage for it to work properly

[BUGFIX] Nodes containing datetime properties cannot be ex-/imported

This change adds the handling of \DateTime instances to the site export and import services.

[FEATURE] FlowQuery find() operation

This change introduces a new operation “find()” which allows for retrieving nodes by relative or absolute paths.

${q(site).find(‘home/about-us/luebeck’).property(‘title’)}

[BUGFIX] Notification styling is broken since CSS classname prepend

The grunt replace file did a double replace on the notification template, first on the literal HTML, later on class=”.

[TASK] Adjustments because of Simple Value / Eel Expression / TypoScript Object Interoperability

[TASK] Use createFromNodeData() instead of createFromNode

[TASK] Use renderValidNodeName() from TYPO3CR\Utility

[TASK] Prepend base CSS with neos-

To prevent issues with Bootstrap 3 and future releases of Bootstrap and other CSS frameworks we prepend all classnames we took over from the original Bootstrap implementation with neos-.

[TASK] Fix wrong indentation in integrator guide

[BUGFIX] Broken node type configuration example

Fixes indentation in an example on custom node types.

[FEATURE] Support for creating other document-like nodes

This change introduces support for creating other than just Page nodes in the content tree. When clicking on the tree’s “+” button, the user may choose from available node types which inherit TYPO3.Neos:Document.

[TASK] Use correct root node in SiteImportService

Uses getRootNode() on Context instead of Workspace.

[BUGFIX] Pin Twitter Bootstrap version to “2” for Wireframe Mode

Fixes an issue with the wireframe mode which would use Bootstrap 3.0 since the latest TYPO3.Twitter.Bootstrap upgrade but is not yet ready for using other versions than 2.x.

[FEATURE] New nodes: set node name according to page title

This patch adds a feature which will automatically set a human friendly node name derived from the node’s title when creating a new node via the (page) tree. Some very basic transliteration is included, proper implementation of that is scope of a separate change though.

If a node with the same name already exists, a counter is added to the node name.

This implementation only takes care of new Document-like nodes which are created via the tree (currently implemented with an ExtDirect controller).

[TASK] Mark document node type abstract

[TASK] Pass TypoScript settings to PluginImplementation

With this change a plugin implementation will receive the evaluated value for a TypoScript setting so it’s possible to configure the plugin by using TypoScript.

Example usage:

prototype(My.Package:BlogPlugin) < prototype(TYPO3.Neos:Plugin) {
  storageNode = ${node}
}

[BUGFIX] Fix typo in comment for ExtDirect\V1\NodeView

[TASK] Add T3.Common.Util as a shared resource

This adds T3.Common.Util as a shared resource and replaces old ocurrances.

The name Util is also changed to the more descriptive name Utility.

[TASK] Replace occurrences of T3.Common.LocalStorage

This replaces occurrences of T3.Common.LocalStorage to use the Shared/LocalStorage instead.

[TASK] Add T3.Common.Notification as a shared resource

This adds the T3.Common.Notification as a shared resource. Also replaces the ocurrances of the old usage in the new JavaScript structure.

But it do not change the PageTree because of the refactoring in the Navigate component (I393fd01266f95ece643999b4e8e59e3710dc76f5) commit.

[BUGFIX] Fix minor comment typos in Application.js

[TASK] Fix TODO abour removal of workaround for cut and paste

In the Application.js there is a comment referring to the issue http://forge.typo3.org/issues/42014

[TASK] Move menu button into top bar dom

[BUGFIX] Fix conflict for dropdown menus

This initializes all dropdown menus via JavaScript instead of relying on the document binding since it breaks if a page includes a separate version of the Twitter Bootstrap dropdown JavaScript.

[TASK] Adjust styling of modals in modules

[TASK] JavaScript code cleanup

  • Removes the InspectButton file which is not used in Neos now and contains invalid dependencies.
  • Changes the UUID validator message to be present time
  • Removes unnecessary require() nesting in HTMLEditor
  • Removes invalid comma from SecondaryInspectorView
  • Commit: 7be2e69

[TASK] Add license information to composer manifest

Fixes file level docblocks accordingly.

[TASK] Code clean up in vie/entity.js

[TASK] Add license information to composer manifest

TYPO3.Neos.NodeTypes

[TASK] Adjusts to new nodeTypeGroups configuration format

[TASK] Remove PHP closing tag

[TASK] make change of MultiColumn element less breaking, re-introducing the layout property

[TASK] adjustments to new processor syntax

[BUGFIX] Image placeholder is not rendered

When new image elements are added to the page the placeholder image is not rendered anymore. This happens because of a regression which was probably introduced because the new resource names where introduced while I0789ee8d79ae9580c872b9131278db846328519f was already under review.

[FEATURE] make CSS classes on containers and images adjustable through TypoScript

[FEATURE] adds a Form Element that uses TYPO3.Form Yaml Files

Via selecting a valid form identifier in the inspecter a TYPO3.Form Yaml Setting File can be rendered.

[TASK] adjust to the removal of neos-reloadable-content

see the corresponding change in TYPO3.Neos for a full explanation.

[BUGFIX] Image placeholder should not be visible in live

Currently the placeholder image is shown regardless if you are logged in to the backend or in which workspace.

With this change it is only shown if you have acccess to the backend and are not on live workspace.

[FEATURE] Allow Aloha Buttons to be configured via yaml settings

[BUGFIX] HTML editor displays dynamically inserted content rather than the actual node’s

[TASK] Add license information to composer manifest

TYPO3.SiteKickstarter

[TASK] Remove PHP closing tag

[TASK] SiteKickstarter should generate NodeTypes.yaml

This creates lets the SiteKickstarter generate a NodeTypes.yaml with explanation and code snippet to add more content areas to your website.

[TASK] Add generateSitePackage() to GeneratorService

The generateSitePackage() method creates a package and fills it with boilerplate data. It is a shortcut for manually creating a package and calling generateSitesXml(), generateSitesTypoScript() and generateSitesTemplate(). These methods are made protected with this change.

[!!!][TASK] Renamed flow command site:kickstart to kickstart:site

The command:

flow site:kickstart My.Site Title

is replaced by:

flow kickstart:site My.Site Title

One the one hand it is more consistent with the other kickstart-command, e.g. kickstart:package, and it allows to add more neos-specific kickstart command, i.e. kickstart:plugin.

[TASK] Use the default package path for new sites

The PackageManager knows about where to store different packages based on type, so we don’t need to generate the path here, and just accept the default configured in Neos.

Depends on Ic87ebaece612e25898318795c748941e5a96b8cb Depends on I59f12a0730af8a96d4beb77b723b2bc41c26eb76

[TASK] Add description to composer manifest

[TASK] Add license information to composer manifest

TYPO3.TYPO3CR

[TASK] Return node label instead of type for fallback label

[FEATURE] Add method to get a node’s full length label

[TASK] Remove PHP closing tag

[FEATURE] Prevent duplicate node paths when moving nodes

[BUGFIX] Prevent error if node type label is undefined

[BUGFIX] Copying a node into itself causes an endless loop

If a node is copied into itself the node gets copied recursively in an endless loop when trying to copy child nodes into the copied node

[BUGFIX] Adjust the test to changed NodeTypeSchema

[FEATURE] Add property “options” to NodeType

[FEATURE] NodeType configuration postprocessing

To add dynamic properties and configurations to the node type configuration this change adds the concept of NodeType postprocessors that can be added to modify node type configurations.

[!!!][FEATURE] Add Node->getClosestAncestor($nodeType)

Now one can easily get the page a content element is located on by calling:

$contentNode->getClosestAncestor('TYPO3.Neos.NodeTypes:Page')

Using just getParent() does not work in most cases to get the page the content element belongs to, because it is often inside a section or other group of nodes.

This change is considered breaking as the method “findOnPath” will now also return something if there are removed nodes in the path. As this is currently not considered anywhere else in the NodeRepository it shouldn’t make a big difference.

[FEATURE] Add recursive search to findByParentAndNodeType

This modifies the ‘findByParentAndNodeType’ method so that you can recursively retrieve all of the matching nodes beneath a path.

[TASK] initializeAction methods have to be protected

[TASK] Adjust to refactored route caching in Flow

[TASK] Use objectarray data type for properties

[BUGFIX] fix regression introduced with moving-nodes-fix

[BUGFIX] Fix moving of nodes across workspace levels

Adds a check for moved nodes in your workspace while fetching child nodes and also introduces dql to make this check faster.

Also implements test cases which show this behavior.

[BUGFIX] (count|find)ByParentAndContentType() are not workspace compliant

Fixes workspace problems in NodeDataRepository methods:

  • findByParentAndContentType()
  • countByParentAndContentType()

This fixes the issue where removed nodes were still counted, unless published.

Also the limit and offset were not always applied correctly if removed nodes were part of the result, so you could still get more nodes back as expected.

[TASK] Adjust database structure to allow long paths

Raises the length of the path and parentpath columns to 4000 instead of 255. This is the lowest common denominator, MySQL and PostgreSQL would support 65535 but we play it safe...

[FEATURE] Support final flag for node types

[FEATURE] Generate node name in createNodeFromTemplate()

This change makes it possible to use createNodeFromTemplate() without specifying a node name and still get the best possible node name.

Generating a name consists of two steps:

  • NodeTemplate generates a valid node name if none has been set. It does this by using the title property of itself (if present) or generating a name using uniqid()
  • createNodeFromTemplate() checks if the node name exists already and appends a counter until an unused name is found
  • Related: #44644
  • Commit: 4b08557

[BUGFIX] getRootNode() returns NodeData despite the name

The name implies that a Node(Interface) instance is used, but in fact NodeData is returned.

This change renames it to getRootNodeData() to be consistent and avoid confusion.

[TASK] Rename createFromNode() to createFromNodeData()

Since this method in NodeFactory creates a Node from NodeData, it should have a matching name.

[BUGFIX] NodeTypeFilter does never match

The introduction of NodeData broke node type filtering in TYPO3CR migrations.

[TASK] Add license information to composer manifest

Fixes file level docblocks accordingly.

TYPO3.TypoScript

[TASK] Remove PHP closing tag

[TASK] Allow colon in TypoScript paths

[FEATURE] add template method in TemplateImplementation

Expose needs a way to add new variables to the Fluid view before it gets rendered, so we add a template method to be used by subclasses.

[!!!][FEATURE] re-implement Processors based on TypoScript Objects and Eel

This is a major overhaul of the TypoScript processors feature.

Before this change, processors were written such as:

myProperty = "some text"
myProperty << 1.wrap(after: '…')

However, then, we introduced Eel objects, and it became more and more clear that processors, while they are very important from a users standpoint, lead to very much duplicated code.

That’s why we are dropping the above syntax completely, replacing it with the following:

New Processors
myProperty = "some text"
myProperty.@process.1 = ${value + '…'}
  • We use the @process meta-property to run processors.
  • The index afterwards describes the ordering on which processors are applied.
  • “value” is a special context variable available in processors which contains the to-be-processed content.
Extended Syntax

Furthermore, there exists an extended syntax as follows:

myProperty = "some text"
myProperty.@process.foo {
  expression = ${value + '…'}
  @position = 1
}
  • This allows to use named processors.
  • For @position, every positional argument is valid, such as “start”, “end”, [any number], “before [otherkey]”, “after [otherkey]”. That’s extremely powerful!
Using TypoScript Objects or Eel Expressions

Instead of using Eel expressions, you can use arbitrary TypoScript objects for processing stuff, as in the (contrived) example below:

myProperty.@process.1 = Some.Namespace:SomeTypoScriptObject {
  value = ${value + '…'}
}
Unsetting of Processors

Unsetting processors was not possible before; now that’s easily done using the “>” operator:

myProperty.@process.1 >

That also works correctly when being combined with prototype inheritance.

Using TypoScript Objects in @override

Furthermore, this change also adjusts the @override functionality such that a context variable’s value is the return value of a TypoScript object:

// this worked already before this change:
myObject.@override.myVariable = ${myOtherVariable + '…'}

// this works now as well:
myObject.@override.myVariable = Value {
  value = ${myOtherVariable + '…'}
}
Code Cleanup

This feature has been developed in a very test-driven manner, every functionality is well-covered with tests. Additionally, the tests and the code of the runtime and parser are cleaned up. The following features were removed as they are obsolete:

  • “old” processor syntax and implementations
  • relicts of TypoScript variables (were non-functional before)
  • relicts of “<<” operator (was non-functional before)

Additionally, the internal representation of TypoScript objects has been changed a little, to make sure you can also set processors on e.g. simple strings.

Furthermore, it is now made sure that if e.g. an Eel expression is defined, this expression overrides a TypoScript object or a simple value which has existed beforehand on a given TypoScript path. The same has been done as well for simple values and TypoScript objects. This is to make sure that at any given TypoScript path, there can only be either a TypoScript object, or an Eel expression, or a simple type. That improves general stability.

When testing this feature, make sure to check out the related changesets with the same topic as well.

[BUGFIX] Make sure prototype inheritance is only flattened at the end of all include-parsing

Problem Description

Imagine a TypoScript file Base.ts2 with the following contents:

prototype(A) {
  a = 'a'
}
prototype(B) < prototype(A)

… and another TypoScript file with:

include: resource:///Base.ts2
prototype(A).a = 'new'

Then you would expect prototype(B).a to be “new” as well.

Without this change, this was not the case, because TypoScript object prototypes were flattened too early.

Solution

Just make sure the flattening of the TypoScript prototypes happens only at the very end of the full parsing step.

While I restructured the tests a bit more, they do not exactly test this case, because it only broke for resource:// URLs (which I don’t know how to emulate in the tests), while it worked for relative includes.

[FEATURE] Make TypoScriptView configurable via Views.yaml

This changes the TypoScriptView to make use of the new way to set options by the view configuration change. See I93acc3ed3d9578a5d00d494b367aa7201138255b

Besides this adds support for multiple fallback paths and makes sure that canRender()` is invoked on the TypoScriptRuntime before rendering the actual TypoScript.

[TASK] Allow Hyphen in TypoScript paths

Allows using the hypen “-” character inside TypoScript paths so you are able to do something like this:

page.header.attributes.data-foo = ‘bar’

[FEATURE] allow “this” in all TypoScript objects to reference other properties

If a user writes complex Eel expressions, it might make sense to use intermediate variables for that. With this change, the following syntax is possible:

myContent = MyTypoScriptObject {
  other = ${5*2}
  myProperty = ${'some complex expression: ' + this.other}
}

This is implemented for all TypoScript objects.

[FEATURE] Implement a Tag TypoScript object

This change implements a versatile Tag TypoScript object to generate correctly escaped markup that is easily extensible. For extensible attributes a new RawArray object that extends the Array object is provided which will not evaluate to a string but to a real array and which provides the same positioning capabilities.

Example:

// Base definition
container = TYPO3.TypoScript:Tag {
    tagName = 'section'
}

// Custom site package
container {
    attributes {
        class = 'landing-page'
        id = 'product-a'
    }
}

[TASK] Refactor ArrayImplementation to use the PositionalArraySorter

With If7487f8724462a5ff48375eda1085a2831becf5a the sorting functionality of the ArrayImplementation has been copied to the TYPO3.Flow package.

This change adjusts the ArrayImplementation to use the new PositionalArraySorter from Flow in order to reduce code duplication.

Depends: If7487f8724462a5ff48375eda1085a2831becf5a * Related: #52074 * Commit: be75230

[TASK] Documentation changes

[TASK] Runtime class can work without a controller context

For some use cases, like rendering TS object in service class, the requirement of the ControllerContext in TS Runtime cause some design problems. Currently the Standalone Fluid view can create a ControllerContext if needed, this patch propose the same thing for the TS Runtime, but based on a factory

[BUGFIX] Removes the test for implementationClassName

As implementationClassName didn’t work in real world it was removed, the test is a leftover that is now also removed.

[FEATURE] Value / Eel Expression / TypoScript-Object interoperability

Currently, there is a big distinction between simple values and Eel expressions, and sub-TypoScript objects; despite them sharing the same namespace.

However, basically, all of the above mentioned three TS data types produce a value which they return to their parent.

This functionality must be tested in the following three dimensions:

1.a using Runtime::evaluate() 1.b using $this->tsValue() inside a TypoScript object

2.a without processors 2.b with processors

3.a pass in a simple type 3.b pass in an Eel Expression 3.c pass in a TypoScript object

This change implements the functionality in a test-driven way, testing all the 12 cases from above.

This change also removes all references to “implementationClassName” which was deprecated for a long time now as well. Using “implementationClassName” instead of “@class” was broken anyway so this is not considered breaking.

[TASK] Revert “Refactor ArrayImplementation to use ArraySorter from Flow package”

This reverts commit 8fbee40e315e2e740b5575442dc9d3a3e98d7492 which was pushed by accident.

[TASK] Refactor ArrayImplementation to use ArraySorter from Flow package

With If7487f8724462a5ff48375eda1085a2831becf5a the sorting functionality of the ArrayImplementation has been copied to the TYPO3.Flow package.

This change adjusts the ArrayImplementation to use the new ArraySorter from Flow in order to reduce code duplication.

[TASK] Add license information to composer manifest