Skip to content

[FEATURE] UI: add Listing\Inline and Listing\Entity\Grid component. - #11444

Merged
thibsy merged 1 commit into
ILIAS-eLearning:release_10from
srsolutionsag:feature/10/ui-grid-entity-listing
Jul 6, 2026
Merged

[FEATURE] UI: add Listing\Inline and Listing\Entity\Grid component.#11444
thibsy merged 1 commit into
ILIAS-eLearning:release_10from
srsolutionsag:feature/10/ui-grid-entity-listing

Conversation

@thibsy

@thibsy thibsy commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

Hi all,

This PR introduces some new features to the UI framework. At its essence, the PR

  • adds a new Listing\Inline component
  • adds a new Listing\Entity\Grid component
  • adds a new Entity\Entity::withWorkflow() functionality

This was spawned by the following background / motivation:

  • the Entity\Entity::withWorkflow() functionality was our solution for the problem we see during object (or entity) creation, where an entity is created kind of as a skeleton, which is filled with content, configured, published, etc. only at a later point – maybe even stretched across several days. What becomes clear is that the object/entity-creation is actually a workflow most of the time. This is why the new functionality now combines these components to speak about this process semantically. The entity will derive "unfinished" steps from this workflow and present them to authors in a structured way. To implement this a new Listing\Inline component was spawned as a byproduct (for horizontal display of properties).
  • the Listing\Entity\Grid component was our solution for the realisation that user expectations for entity listings are different depending on their use-case. "Consumers" of an entity need a lighter, less detailed view than authors, who may need to see what steps of the entity creation workflow are still unfinished.
  • both of these solutions integrate nicely with the ILIAS repository. Object creation is a multi-step process and authors have the ability to toggle between a view/manage screen. This means the PR already lays some important groundwork for when the repository is finally migrated towards Kitchensink components during the LUI project.

Why we propose to integrate this for ILIAS 10:

We do not have everything in place to fully migrate the repository yet. Making these solutions available for plugins from ILIAS 10 will allow us to gather information for this migration beforehand. Namely this will be the OpenCast plugin, which provides its own sophisticated view inside the repository – making it the perfect candidate to test this before moving forward in ILIAS. There are no breaking changes for any usage of the components affected by the changes of this PR. However, there would be breaking changes for custom version of affected components, implemented by the plugin.

Kind regards,
@thibsy

@thibsy thibsy added kitchen sink php Pull requests that update Php code css/html Pull requests that propose changes to CSS/SCSS or HTML files. labels Apr 21, 2026
@thibsy thibsy added the translations Pull requests that propose changes to ILIAS language files. label Apr 21, 2026
@thibsy thibsy self-assigned this Apr 22, 2026
@thibsy
thibsy force-pushed the feature/10/ui-grid-entity-listing branch from 6897338 to e816414 Compare April 23, 2026 12:04
@matthiaskunkel

matthiaskunkel commented Apr 27, 2026

Copy link
Copy Markdown
Member

Jour Fixe, 27 APR 2026: We highly appreciate this suggestion and see it as a very ambitious and promising improvement of the UI framework. Until a final decision about this PR it would be great to have some screenshots to visualise the suggested changes. We also wait for the feedback from our accessibility expert and comments from Oliver. In general, we do not see a reason not to accept these changes also for 10 as no breaking changes will be expected – simply because none of these features are used until now.

@thibsy

thibsy commented May 11, 2026

Copy link
Copy Markdown
Contributor Author

Hi folks, here are some screenshots:


Grid Entity Listing:

screenshot of new grid entity listing

Inline Listing:

screenshot 1 out of 2 of new inline listing screenshot 2 out of 2 of new inline listing

@thibsy
thibsy force-pushed the feature/10/ui-grid-entity-listing branch 3 times, most recently from 560a3eb to 24b3fb4 Compare May 12, 2026 10:48
@thibsy thibsy added the accessibility Pull requests that propose A11Y changes. label May 12, 2026
@Annett7811

Copy link
Copy Markdown
Contributor

Thank you very much for this very well thought-out proposal. The presented components appear highly promising, and in particular the attached screenshots as well as the presentation within the KS Examples greatly help to better understand the proposed changes and their potential use cases.

From an accessibility perspective, the new workflow-related information offers significant potential — especially if editing states, open steps, and status information are also made programmatically available to assistive technologies. In addition, aspects such as responsive design, different zoom levels (e.g. 200% text zoom and browser zoom up to 400%), as well as possible impacts on reflow, should be considered and tested early on to ensure that the new components remain robustly usable under magnification and on smaller viewports.

The different orientation of the listing variants towards distinct usage contexts (consumer vs. authoring) is particularly interesting. This could also contribute to a clearer and more focused presentation of information.

Overall, I see this as a very exciting and forward-looking foundation for the further development of the UI framework and look forward to the upcoming discussions as well as practical experiences from the planned implementation scenarios.

Best regards,
@Annett7811

@matthiaskunkel

Copy link
Copy Markdown
Member

Jour Fixe, 18 MAY 2026: We highly appreciate this suggestion and accept already the interface changes offered in this PR. A final approval of the PR depends on the official feedback from Oliver Samoila as responsible authority.
The mentione issue about keyboard navigation will be fixed.
Triggered by the different image ratios of the above shown example we agreed that the UI component itself should show a provided image as it is given and decide about its sizes and ratios.
Having this new/extende UI component does not relieve us the obligation to define a strategy for how this UI element will be implemented in the future by the different components in ILIAS. But this is not related to the acceptance of this PR.

@thibsy
thibsy force-pushed the feature/10/ui-grid-entity-listing branch 2 times, most recently from 03ea7bf to fe966ca Compare June 2, 2026 07:56
@oliversamoila

Copy link
Copy Markdown
Contributor

Hello @thibsy,
Thank you very much for this extensive work.
I have taken another close look at the latest status and would like to raise a number of questions about it:

Content-related questions on the these UI components:

  • Entity\Entity::withWorkflow()
    • Shouldn't the Primary Identifier contain a Headline x? – the way Items in Panels or other objects did in the former ListGUI?
    • Why are the glyphs (glyphicon-calendar and glyphicon-user) clickable, and what is supposed to be behind them? Is this meant to be understood as a Key-Value-Pair, and is it understood as such?
    • What leads to the runtime length of the video being a "Main Detail", whereas "upload date" and "publisher" are each a Featured Property? Is this a decision that will, going forward, be left to every object that is to be represented in an Entity?
    • What exactly are 'Show more' and 'show less'? (Apparently not Shy-Buttons, which we — at least in perspective — don't want to scatter ever more across the system.)
    • May I picture it like this: that in the Repository (or in another place) I see several Entities and then have a Workflow below each of them?
      • Or which container structure is used when there are multiple Entities on one page? In my view, the Workflow sits on the same level as the Entity and is apparently not a part of it.
      • Is this really understood/understandable by users (and screen readers) with regard to the information structure and also an information hierarchy?
    • Can users interact with the video in any way?
      • The same question could be asked for images or audio.
      • Or also for representative images of objects, in order to actually open the object.
    • If I see it correctly, we have 736px as a new breakpoint for small mobile views. Does this correlate with any other behaviors at this value?
  • Listing\Entity\Grid
    • My most central question for this is: is this intended to replace the previous tile view (Card\Repository Object in Panels) in the future?
    • The images (a 'Secondary Identifier' in the schema of the Entities) introduce a new size. In order to avoid the conflicts during a UI migration already now, these should be cropped in 3:2.
    • In my view, we need a different placement of the Reaction Bar, because the goal "entity need a lighter […] view" is, in my opinion, directly missed again this way.
    • Please remove the il-glyphicon-love in front of the Like button. This will not be able to work plausibly with what the Like service outputs.

Core Usage

I would also like to say a few words on the perspective of its use in the core:

  • The two biggest organizational obstacles to switching to Entities are, in my view: a) clarifying the question of what 'Featured Properties' are. This has to be clarified for every type of Entity. In addition there is b) the dependency on reworking and decoupling from the ilObjectListGUI — one may take the wording with a grain of salt, but to my knowledge this is not possible without work in the Object component.
  • If the creation of an Entity across its steps is a central problem to be addressed, then it is to be assumed that this is a problem that applies to all types of Entities. If that is the case, then for a consistently appearing system we need Workflows for all types of Entities. In my view, this is even more questionable than the definition of 'Featured Properties'. In my opinion, the question of whether an Entity should have a Workflow should be strongly distinguished from the question of whether it must have a Workflow. I do not believe that this ‚must' exists here.
  • When you say: "authors have the ability to toggle between a view/manage screen", then it would be important to know where users do this? And between which representations users toggles? Or we should make it clear that this is a prospective view. That would be completely fine too.
  • For the sake of delimitation, I would like to point out that none of the components marked as deprecated in the "Removing LegacyUI" project would necessarily have to be processed via this form of Entities. Work on these specific UI components is not currently part of the project scope, although I wouldn’t rule out the possibility that parts of them might be used in the future – that would after all be highly charming.

I look forward to hearing from you. Not least because I believe that some of the answers are still important for gaining a better understanding of future perspectives – especially regarding the usages and further developments.

Many many thanks and best regards
@oliversamoila (as UI-coordinator)

@oliversamoila

Copy link
Copy Markdown
Contributor

Just a quick addition: here are some screenshots showing the latest version.
You can already see some further improvements in it, and it might make it easier for some of you to follow the discussion.


Entity\Entity::withWorkflow():
image


Listing\Entity\Grid:
image

@thibsy

thibsy commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

Hi @oliversamoila,

Thx for the elaborate feedback!

Let me respond to your questions/remarks above:

Content Aspects:

  • Entity\Entity::withWorkflow():
    • Primary identifier: I think we should, but we also should not do so until we have a centralised solution for this.
    • Clickable Glyphs: that is defined by the consumer. For demonstration purposes, they feature an action. They could do something, but do not have to.
    • Featured properties: since this is a demo, I haven't given it too much thought. But in general, consumers need to think about this carefully and should refer to the paper on repository items. It would make sense to define things like that on a per object basis somewhen in the future. This will help us figure out semantic descriptions and groups.
    • Show more/less: that is actually a (S)CSS-only functionality that truncates long-ish text. It is implemented as a tool that should be used in the future instead (ping @BettyFromHH).
    • Workflow output: the example might be misleading, because the workflow will only be used to talk about the process semantically and programatically. If the entity is provided with a workflow, this workflow will in fact never be rendered. It will be used to derive actions required to complete object creation. I will make this more clear by simply removing this rendering.
    • Interaction: you cannot interact with the entity listed inside this grid other than by its exposed actions. You do not interact with anything inside this listing directly, the listing or the concrete actions will delegate to the responsible endpoint provided by the consumer.
    • Breakpoint: the listing does not change significantly at 736px. Could you explain what felt odd about the responsiveness during your review? The grid works a little differently due to working with rows and columns, which is why this may feel detached to other breakpoints.
  • Listing\Entity\Grid:
    • Replacement: this listing is meant to replace the current solution of the repository. The card and panel are both weak in semantics and should possibly be deprecated and removed or internalised in the end. If we replace the solution with this grid directly is unknown yet. Maybe we need a higher-order component that gives more semantics to the concrete list type and less opportunity for defining options.
    • Image format: we already discussed this at JF, where we decided to require cropping by the consumers. Otherwise we might crop information deemed necessary. I fixed the images inside the examples though, because they were actually not cropped correctly =). There is a usage rule on the factory now too.
    • Reaction bar: I think you raise two concerns here: one being the placement of the bar and the other about its presence. If you agree, I would like to treat this in another iteration. The current placement was by design, since we found several reactions like this featured in this corner.
    • Like-service: I updated to the "like" glyph instead. I think we should not try to mimic the output of this service inside our documentation though.

Core Usage:

  • Organisational obstacles:
    • a) I think the paper on repository items gives us a pretty good idea on what featured properties are. Nonetheless, it would be highly beneficial if one person or small group we would categorise all properties of the different kinds of entities we have in ILIAS.
    • b) You are right about the coupling to ILIASObject.
  • Object creation workflows: I do not think that it is necessary to implement the creation of all entities in multiple steps. The goal should ultimately be that those who want to make use of this should be able to use a generalisation of this. This needs to be derived first, of course. I think this should ideally be maintained inside the ILIASObject component. And again, the workflow is only virtual in all this. We could visualise it somewhere, but do not have to. For the entity its only important so we can speak about the creation semantically and derive required actions.
  • View/Manage screen: that is indeed correct. This is only a prospect and possible feature for the future.
  • Removing LUI: yes you are right, I mistakenly thought that ilObjectListGUI and variations were in this scope – which they are not. But replacing them will be necessary anyways.

I hope this answers all of your questions/remarks. Let me know if you need some more information. Otherwise I would like to integrate this by the end of next week.

Kind regards
@thibsy

@thibsy
thibsy force-pushed the feature/10/ui-grid-entity-listing branch 2 times, most recently from 81f4b89 to eef99be Compare June 30, 2026 15:02

@oliversamoila oliversamoila left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @thibsy.
Thank you very much for all your answers and insights. They help me to understand, and perhaps also help those who are reading along or who might look back at the decisions and reasoning at a later date.

Just a quick bit of feedback to work through this:

Content Aspects:

  • Entity\Entity::withWorkflow():

    • Primary identifier and headline: I’m completely in agreement with doing these things one after the other. It’s important to me that, when using the Entity, we don’t later end up back in a situation that we’d already resolved for accessibility reasons. Thank you.
    • (Clickable) Glyphs: Thanks also for this explanation. This essentially means we can and should refer to the descriptions and rules of the UI Component Glyph. Many thanks.
    • Featured Properties: Check.
    • Show more/less: Check.
    • Workflow output: Omitting the display of the effectively virtual workflow for the documentation there is also an option. That’s fine by me.
    • Interaction: Check.
    • Breakpoint: I’m actually a bit confused about the pixel value myself now. I’ve had another look at it and must actually have been referring to 768px «» 769px. Should we use the same entity displays in the display area from 769px to 991px (i.e. where the main bar is already positioned at the bottom) as we do in the viewport up to 768px? It’s not a strict requirement, but things like this tend to remain the same for a long time once set. Thanks.
  • Listing\Entity\Grid:

    • Replacement: Check.
    • Image format: Check. And thanks.
    • Reaction bar: I fully agree. It might be worth considering a different layout here – perhaps one that saves space or is more familiar from other applications – in the future, not right now.
    • Like service and output: Check.

Core Usage:

  • Defining the FeatureProperties: I’d at least like to have mentioned this to @matthiaskunkel. It’s entirely plausible that this conceptually necessary work might be overlooked during the creation of the UI component. We should tackle this conceptual work in the not-too-distant future, so that it doesn’t become a missing bridge when it comes to the UI migration.
  • Object creation workflows: check. Thanks again for the explanations and the clarification that “the workflow is only virtual in all this”.

Please feel free to integrate the current status. Many thanks to you and everyone involved.

Best regards
@oliversamoila (as UI Coordinator)

@oliversamoila

oliversamoila commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Here’s just a screenshot showing the Breakpoints/Viewports aspect:
It’s all rather tight together. Perhaps adjusting the layout as described above might well make sense. Just a quick suggestion.
 
image

@thibsy
thibsy force-pushed the feature/10/ui-grid-entity-listing branch from eef99be to c4fb271 Compare July 6, 2026 09:26
@thibsy
thibsy merged commit f7d1f39 into ILIAS-eLearning:release_10 Jul 6, 2026
3 checks passed
thibsy added a commit that referenced this pull request Jul 6, 2026
…ts (#11444)

Breaking changes:

- For plugins that provide a custom implementation of `ILIAS\UI\Component\Listing\Entity\Factory` and/or `ILIAS\UI\Component\Listing\Factory` by using the according exchange mechanism.
- For plugins that provide a custom implementation of the following UI components and their respective interface:
	- `ILIAS\UI\Component\Entity\Entity`
	- `ILIAS\UI\Component\Listing\Property`
	- `ILIAS\UI\Component\Symbol\Glyph`
- For skins that replace one or more of the following templates:
	- `Entity/tpl.entity.html`
	- `Listing/tpl.propertylisting.html`

Given the novelty status of the entity (and associated) UI component(s), such cases should be rare, and any breaking change could be fixed in a backwards compatible manner. We therefore consider these breaking changes acceptable, as their value outweighs their harm.
thibsy added a commit that referenced this pull request Jul 6, 2026
…ts (#11444)

Breaking changes:

- For plugins that provide a custom implementation of `ILIAS\UI\Component\Listing\Entity\Factory` and/or `ILIAS\UI\Component\Listing\Factory` by using the according exchange mechanism.
- For plugins that provide a custom implementation of the following UI components and their respective interface:
	- `ILIAS\UI\Component\Entity\Entity`
	- `ILIAS\UI\Component\Listing\Property`
	- `ILIAS\UI\Component\Symbol\Glyph`
- For skins that replace one or more of the following templates:
	- `Entity/tpl.entity.html`
	- `Listing/tpl.propertylisting.html`

Given the novelty status of the entity (and associated) UI component(s), such cases should be rare, and any breaking change could be fixed in a backwards compatible manner. We therefore consider these breaking changes acceptable, as their value outweighs their harm.
katringross added a commit to kroepelin-projekte/ILIAS that referenced this pull request Jul 8, 2026
* [FIX] 47851: Evaluation statement text is not saved after < sign (KS textarea)

* fix text sorting in datacollection (ILIAS-eLearning#11720)

* [Fix] Exercise, #47925: Action Evaluation by File does not update evaluation date for Team Uploads

* [FIX] Exercise #47850: Team uploads: Only 1st team member can see evaluation statement

* fix Mantis #47475

* [Fix] LDAP: Correctly display user synchronization cron status

See: https://mantis.ilias.de/view.php?id=48023

* [FEATURE] UI: add `Listing\Inline` and `Listing\Entity\Grid` components (ILIAS-eLearning#11444)

Breaking changes:

- For plugins that provide a custom implementation of `ILIAS\UI\Component\Listing\Entity\Factory` and/or `ILIAS\UI\Component\Listing\Factory` by using the according exchange mechanism.
- For plugins that provide a custom implementation of the following UI components and their respective interface:
	- `ILIAS\UI\Component\Entity\Entity`
	- `ILIAS\UI\Component\Listing\Property`
	- `ILIAS\UI\Component\Symbol\Glyph`
- For skins that replace one or more of the following templates:
	- `Entity/tpl.entity.html`
	- `Listing/tpl.propertylisting.html`

Given the novelty status of the entity (and associated) UI component(s), such cases should be rare, and any breaking change could be fixed in a backwards compatible manner. We therefore consider these breaking changes acceptable, as their value outweighs their harm.

* [Fix] Init: Add installation signature to password assistance emails

See: https://mantis.ilias.de/view.php?id=48027

* sync language files

* Category: #47834: Missing RBAC check in ilContainerFilterAdminGUI

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Object: Do Not Show Debug Info on Import Failure

See: https://mantis.ilias.de/view.php?id=47952
Signed-off-by: Releasemanager <webmaster@ilias.de>

* 47954: Notes: Edit form for private notes accessible by all users

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Fix 0047887: SOAP IDOR by enforcing session-user read access in ilSoapObjectAdministration

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Course: Transform participant selection string

See: https://mantis.ilias.de/view.php?id=47800
Signed-off-by: Releasemanager <webmaster@ilias.de>

* Release 10.9

* 48038: Course Membership View throws error (current test10.ilias.de)

---------

Signed-off-by: Releasemanager <webmaster@ilias.de>
Co-authored-by: Alexander Killing <killing@leifos.de>
Co-authored-by: iszmais <45942348+iszmais@users.noreply.github.com>
Co-authored-by: Uwe Kohnle <kohnle@internetlehrer-gmbh.de>
Co-authored-by: mjansen <mjansen@databay.de>
Co-authored-by: Thibeau Fuhrer <thibeau@sr.solutions>
Co-authored-by: Releasemanager <webmaster@ilias.de>
Co-authored-by: Stephan Kergomard <webmaster@kergomard.ch>
Co-authored-by: Sagun Karki <sagun.karki@minervis.com>
c-knof added a commit to kroepelin-projekte/ILIAS that referenced this pull request Aug 12, 2026
* [FIX] 47851: Evaluation statement text is not saved after < sign (KS textarea)

* fix text sorting in datacollection (ILIAS-eLearning#11720)

* [Fix] Exercise, #47925: Action Evaluation by File does not update evaluation date for Team Uploads

* [FIX] Exercise #47850: Team uploads: Only 1st team member can see evaluation statement

* fix Mantis #47475

* [Fix] LDAP: Correctly display user synchronization cron status

See: https://mantis.ilias.de/view.php?id=48023

* [FEATURE] UI: add `Listing\Inline` and `Listing\Entity\Grid` components (ILIAS-eLearning#11444)

Breaking changes:

- For plugins that provide a custom implementation of `ILIAS\UI\Component\Listing\Entity\Factory` and/or `ILIAS\UI\Component\Listing\Factory` by using the according exchange mechanism.
- For plugins that provide a custom implementation of the following UI components and their respective interface:
	- `ILIAS\UI\Component\Entity\Entity`
	- `ILIAS\UI\Component\Listing\Property`
	- `ILIAS\UI\Component\Symbol\Glyph`
- For skins that replace one or more of the following templates:
	- `Entity/tpl.entity.html`
	- `Listing/tpl.propertylisting.html`

Given the novelty status of the entity (and associated) UI component(s), such cases should be rare, and any breaking change could be fixed in a backwards compatible manner. We therefore consider these breaking changes acceptable, as their value outweighs their harm.

* [Fix] Init: Add installation signature to password assistance emails

See: https://mantis.ilias.de/view.php?id=48027

* sync language files

* Category: #47834: Missing RBAC check in ilContainerFilterAdminGUI

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Object: Do Not Show Debug Info on Import Failure

See: https://mantis.ilias.de/view.php?id=47952
Signed-off-by: Releasemanager <webmaster@ilias.de>

* 47954: Notes: Edit form for private notes accessible by all users

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Fix 0047887: SOAP IDOR by enforcing session-user read access in ilSoapObjectAdministration

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Course: Transform participant selection string

See: https://mantis.ilias.de/view.php?id=47800
Signed-off-by: Releasemanager <webmaster@ilias.de>

* Release 10.9

* 48038: Course Membership View throws error (current test10.ilias.de)

* fix: Export pdf format (ILIAS-eLearning#11731)

* [Bugfix] Badge: Mark Badges without Images as migrated

* 47633: TOC shows chapters with no active pages

* 0047549: Member View disappears when you click on a folder in a course and the slide displays the repository.

* 47946: Link areas do not display tooltip

* [Bugfix] Mail 047999: Fix CC/BCC Mails Generic Placeholder not replaced with corresponding value (ILIAS-eLearning#11713)

* 48062: Unterschiedliches Verhalten bei Klick in Aktionen-Menü von Plugins und Kernfunktionen

* [Bugfix] Mail 047999: Fix DatePresentation lng tearDown in ilMailTemplatePlaceholderToEmptyResolverTest

* Mantis #30823: add Course AboStatus to XML export & import (ILIAS10) (ILIAS-eLearning#10661)

* add Course AboStatus to XML export & import

* revert change to ilias_crs_9_0.xsd

* 0030823: make AboStatus optional to keep existing ILIAS 10 exports compatible

* [FIX] portfolio 46975: prtt_edit does not resolve in Portfolio Template Edit mode

* [FIX] COPage: 42945: Print view doesn't show svg

* [FIX] Container: 31459: Karten einfügen weiterhin als Element für Seitengestaltung auswählbar, obwohl in Administration deaktiviert

* fix data persitation on confirmation (ILIAS-eLearning#11745)

* Fix for mantis issue 48050

* [FIX] Exercise, try to address 48020: Silent Failure: Failed file upload creates 0-byte file without user notification

* blog: centralise permission checks

* 10 map 43204 display markers (ILIAS-eLearning#11690)

* [FIX]: replace MarkerImage with icon object for Google markers (fix mantis #43204)

* [FIX]: display multiple Google maps on one page

* [Fix] Mail: Don't manipulate password from configuration form

* MetaData: accept imports without title, set placeholder title on md transfer if none exists (48040)

* [FIX] Survey: Correct mean calculation (ILIAS-eLearning#11771)

Co-authored-by: Saúl Díaz <sauldiazdiaz210@gmail.com>

* WebLink: truncate too long list title before writing to db (47980)

* [Language] update: T&A spanish language variables (ILIAS-eLearning#11775)

* ECS: Restore HTTP protocol option in GUI

* Calendar: fix mismatched type (48096)

* [Survey] fix: Access to appraisee ID (ILIAS-eLearning#11801)

* fix: preserve blocked status of course members in updateCourse SOAP call (0040575) (ILIAS-eLearning#11602)

* [Survey] fix: Handle non auth access to Survey (ILIAS-eLearning#11804)

* Dependencies: Update PHPSpreadsheet

* ILIASObject: consistently use long description on object creation so that multilingualism does not get confused (48105)

* Object: Add Default Value for Info-Tab visibility

See: https://mantis.ilias.de/view.php?id=46397

* User: skip broken users in gallery

See: https://mantis.ilias.de/view.php?id=47791

* [FIX] 48047: Änderungen im Content Style wirken sich nicht aus

Entries inside a container are stored relative since Mantis 45580 / 47237,
e.g. "style.css". Containers written before that hold the same file as
"/style.css", and once such a container is written again both variants exist
side by side. Streams::ofFileInsideZIP() looked up the variant with the leading
slash first, so consumers kept receiving the outdated legacy entry: a content
style is written correctly but never changes for the user. Newly created styles
are not affected, copies inherit the problem with the cloned ZIP, and
export/import produces a clean container.

ofFileInsideZIP() now looks up the relative entry first and falls back to the
legacy one, which fixes existing containers without touching them - the ZIP
stream wrapper matches entry names literally, so no container can be resolved
to the wrong entry by accident.

Additionally the legacy entries are cleaned up over time: addUploadToContainer()
no longer produces entries with a leading slash itself when the parent path
inside the container is empty, and removePathInsideContainer() removes both
variants of the given path.

* Document SOAP interface access restrictions

Added section on restricting access to the SOAP interface with configuration examples for Apache2 and Nginx.

* Fixed Mantis #0048133: -glo_remove_glossary- // Missing translation

* Test: Fix Feedback in Cloze

See: https://mantis.ilias.de/view.php?id=48135

* Test: Fix Display of SpecialChars in Essay

See: https://mantis.ilias.de/view.php?id=48138

* Update link to the coding guidelines.

* Test: Fix Import on Missing User

* Test: Fix Recalculation of Points

If points are changed and there already is question with changed
points before the one being changed, the points are not recalculated.

* [Survey] fix: Check participation after period (ILIAS-eLearning#11842)

* [Survey] fix: Delete option verification within routings (ILIAS-eLearning#11846)

* copage: array key fix

* copage: prevent ctrl issues in copy process

* Container: remove objectives-settings info blocks in course content

* 47866: Page Editor: Text: List format options expand to the left and are not fully viewable for users

* 47929: Error Allowed memory size exhausted when downloading large files via action Download Selected Submission

* 47835: Using an & in a tilte of a Content-Style Class prevents page rendering

* 47920: Error Opening and ending tag mismatch when editing text blocks containing internal links to missing/deleted objects

* 48126: Page editor whoopses on trying to save paragraph with just an empty list bullet

* learning module: 48061: Ausgeschnittene Kapitel und Seiten lassen sich nicht in ein anderes Lernmodul einfügen

* [FIX] #45665 UI: `Table\Ordering` submission on enter (ILIAS-eLearning#10832)

* Fix https://mantis.ilias.de/view.php?id=45665
* Add event listener to numeric inputs of `Table\Ordering` that prevent form submission on 'Enter'.

* [FEATURE] UI: add new `Symbol\Glyph` variations.

* Add "date", "owner", "presenter" and "location" glyphs
* Update "calendar" glyph

* [FIX] UI: update icon-font binaries

Addendum to c29a2d0 which pushed
faulty icon-font binaries. This recreates proper binaries without
changes to existing icon codes.

* [FIX] Style: recompile delos stylesheet

* [FIX] #46107 UI: update `MainControls\Footer` section sizes (ILIAS-eLearning#10372)

* Fixes https://mantis.ilias.de/view.php?id=46107
* Update section 1 and 5 from 4 column grid to 2 column grid
* Add section grid size CSS modifier

* [FIX] Style: recompile delos stylesheet

* Test: Fix Tab Activation in ErrorText

* Test: Fix Display of ErrorText with Errors

* Test: Remove Unnecessary Setting of Active Tab

* Fixed Mantis #34604: incorrect byline in learning objectives driven courses - settings

* Fixed Mantis #34613: Adjusting the task description of objectives in LOCs

* AdvMD: change lang var for field creation success message (32430)

* Fixed Mantis #42408: Sitzung Einstellungen: Anpassung von Optionen für Benachrichtigung

* Fixed Mantis #42363: Missing lang var for "User Language changed..."

* Modified error message

* Test: Initizalize Variable in Text Question

See: https://mantis.ilias.de/view.php?id=48179

* Test: Fix Unescaped HTML In Kiosk View

See: https://mantis.ilias.de/view.php?id=48066

The participant name in the test kiosk title was inserted as raw HTML,
which could break rendering when the name contained special characters.
The value is now escaped and passed via a legacy UI component.

* Lang: Order Lang Files

* Re-added correct lang var for error message

* [FIX] OrgUnit: Fix "Multi Input" element when managing positions (ILIAS-eLearning#11500)

See: https://mantis.ilias.de/view.php?id=47236

* [FIX] #48172: Fix video playback issue occuring on apple safari (ILIAS-eLearning#11867)

Fixes https://mantis.ilias.de/view.php?id=48172

* ResourceStorage: rewrite the container archive once when unzipping

Appending the contents of a ZIP to a container called addStreamToContainer()
once per file. Every one of those calls opens and closes the container
archive, and ZipArchive::close() never appends in place, so the complete
archive was rewritten for each individual file.

Extract the source archive once and hand the resulting directory to the new
ContainerManager::addDirectoryToContainer(), which writes the container
archive a single time. Extraction reuses ILIAS\Filesystem\Util\Archive, so
the shared ignore list (__MACOSX, .DS_*) applies and no separate path
handling is needed here.

Mantis 48134

* ResourceStorage: report the actual result of the unzip action

unzip() is reached via GET, but postUpload() derives its message from the
POST body, so the action always reported "No Resource(s) added", even when
it succeeded. Report what unzip() actually returned instead.

Also guard against an empty path list, which ran into an undefined offset.

Mantis 48134

* [FIX] 45525: Number of users in "Communication - Announcements" is incorrect

The role selection of an administrative notification labelled every option
with "<role title> (<obj_id>)". Administrators mistook the object id in
parentheses for the number of users assigned to that role, which made the
numbers look arbitrarily wrong - e.g. "Admin (521121)" for a role with three
members, or "Lehrende - Verwaltung - Wimis (166)" for a role with 439 members.

The visibility of a notification was never affected by this: it is resolved
from the stored role ids via ilRbacReview::isAssignedToAtLeastOneGivenRole().

The option label now shows the role title only.

See https://mantis.ilias.de/view.php?id=45525

* [FIX] 45344: HTTPS Detection uses Header value as protocol for question links

RequestFactoryImpl used the configured header value of the automatic https
detection (auto_https_detect_header_value) for two different purposes: as the
value the incoming header is compared against, and as the scheme the request
URI is rewritten to. The second use is wrong - the setting describes when
https is in use, it is not the protocol itself.

With the documented setup

    auto_https_detect_header_name = "FRONT-END-HTTPS"
    auto_https_detect_header_value = "on"

every generated URI therefore started with "on://", which broke the links to
edit questions in a question pool. The problem only stayed invisible for
installations whose header value happens to be the literal string "https",
which is why switching to X-Forwarded-Proto worked around it.

The request URI is now rewritten to https once the configured header matches,
independent of the configured value. This matches what ilHTTPS and the SOAP
entry point already do: they compare the value and then set a fixed result.

Covered by ILIAS\HTTP\Request\RequestFactoryImplTest.

See https://mantis.ilias.de/view.php?id=45344

* [IMPROVEMENT] Finder: micro optimizations, type documentation and new limit()/hasAny() API (ILIAS-eLearning#11490)

- adds micro optimizations for the Finder,
- introduces a fluent limit()-API on the Finder to allow the iteration over a limited subset of items,
- adds hasAny() as an existence check optimized for performance-sensitive paths by short-circuiting after the first match and avoiding unnecessary sorting work,
- and improves the explicit and documented PHP types.

Fixes three latent defects on the way:
- searchInDirectory() appended the VCS patterns to $this->exclude on every call, so repeated iteration or multiple in() directories kept growing the exclude list of a supposedly immutable Finder,
- sorting was applied per directory inside searchInDirectory() and therefore never across the combined result set of multiple in() directories,
- append() rejected every plain iterable because it tested the elements against MetadataType, a constants-only interface which Metadata does not implement.

* [FIX] 47021: Bottleneck AbstractFileSystemStorageHandler::cleanUpContainer

cleanUpContainer() removes the first level directory of a container once it
no longer holds any file. To find that out it counted every file below that
directory with Finder::count(), which runs iterator_count() over the whole
subtree - although the only question is whether at least one file is left.

With MaxNestingPathGenerator the first level consists of three hex characters,
so a platform spreads all of its resources over just 4096 buckets. On larger
installations every bucket therefore holds thousands of files, and since
deleteResource() calls cleanUpContainer() once per resource, deleting a user
with many files paid a full recursive count per file. Measurements in the
report show about 2 seconds for this single call.

The check now uses Finder::hasAny(), which short-circuits after the first
match instead of counting. This is the same predicate as before - hasAny()
is false exactly when count() was 0 - but in the common case, where the
bucket still holds files of other resources, it only has to list the few
directory levels down to the first file.

See https://mantis.ilias.de/view.php?id=47021

* [FIX] 46652: $this->getPlugin()->getDirectory() returns incorrect path

ilComponentRepository::PLUGIN_BASE_PATH is a class constant and therefore has to
be a constant expression, which is why it is written as

    __DIR__ . '/../../../../public/Customizing/global/plugins'

Nothing ever resolved those "..", so every path built from it carried the detour
through the component directory. ilPlugin::getDirectory() handed that out to the
plugins verbatim, which is what the report shows:

    /var/www/ilias10/components/ILIAS/Component/classes/../../../../public/Customizing/global/plugins/...

The path did point at the right directory, but it is unusable for anything that
compares or displays it, and it is not what a plugin can work with.

ilPluginInfo::getPath() now resolves "." and ".." itself. This is done without
touching the file system, so it also works for a plugin which is not installed
yet - realpath() would return false there.

Note that getDirectory() still returns an absolute path. That is intended since
43587, which made PLUGIN_BASE_PATH absolute so that the setup finds plugins in
CLI context as well. Plugins which need a path relative to the web root, e.g. to
reference an asset, have getRelativeDirectory() for that. It no longer collapses
to an empty string when realpath() fails for a plugin directory which does not
exist.

See https://mantis.ilias.de/view.php?id=46652

* [FIX] 44340: adding javascript or css file through global page template does not support absolute path returned by plugin

Javascript and stylesheets are delivered relative to the web root, and both
addJavaScript() and addCss() stored whatever they were given unchanged, so the
value ended up in the markup as it came in. A plugin, however, only knows its own
absolute location - ilPlugin::getDirectory() returns exactly that - which left it
with no way to register an asset: the resulting src pointed at a file system path
no browser can request.

Both entry points now cut the web root off a path which lies below it, so an
absolute path from getDirectory() works as well as a relative one. Everything
outside the web root is left untouched, external URLs and data URIs included,
since they never start with the web root.

The conversion is applied in ilGlobalTemplate and in MetaContent, because the two
template implementations do not share this code: ilGlobalPageTemplate, the global
$tpl since ilInitialisation, delegates to MetaContent, while ilGlobalTemplate is
used for the standalone templates of the startup, error and fullscreen pages.

Plugins may of course still use getRelativeDirectory() to obtain the web path
themselves.

See https://mantis.ilias.de/view.php?id=44340

* [FIX] 0047398: Failed test: Löschen von Datei in temp-Verzeichnis

The cron job "Clean Temp Directory" aborted completely as soon as a single path
containing control characters (e.g. a tab or a line break) was encountered. Such
paths are created by ILIAS itself, but they are rejected by the path normalizer
of Flysystem, which throws a CorruptedPathDetected. The exception was raised
while the finder was traversing the directory tree, therefore it could not be
handled by the try/catch blocks inside the cleanup loops and the whole job died
without deleting anything.

Catch the rejected paths where ILIAS wraps Flysystem, so that they no longer
abort the caller:

- FlySystemDirectoryAccess::hasDir() and FlySystemFileAccess::has() report a
  path the normalizer refuses as non existing instead of throwing.
- RecursiveDirectoryIterator::rewind() treats a directory which cannot be listed
  as empty, so a single unusable directory no longer aborts the traversal.

These paths can neither be listed nor deleted through the filesystem, hence they
are skipped during the cleanup. To keep them visible, the cron job now looks for
them explicitly and logs each of them, reporting only the topmost path of an
affected subtree. Their number is added to the job result, so the cron table
hints at them as well.

Picked from release_11 (e8970a6). Adjusted to this release: the cron job
still builds an ilCronJobResult instead of a JobResult, and the iterator keeps
its foreach loop over the listing, the early return for an unlistable directory
was added on top of it.

* [FIX] 30709: Special char in assignment title breaks download of submissions

Downloading all submissions of an exercise assignment failed with an
UnexpectedValueException whenever the assignment title contained a control
character such as a vertical tab or a tab:

  RecursiveDirectoryIterator::__construct(.../temp/tmpX/KW 49 _ SW 5 - ...):
  Failed to open directory: No such file or directory

Two independent defects add up here:

- ilFileServicesPolicy::ascii() replaced the characters an OS forbids in file
  names, but left the C0 control characters untouched. They therefore ended up
  in the directory created by ilExerciseManagementCollectFilesJob, and in the
  Content-Disposition header built from the same value.

- PathHelper::normalizePath() removed every \p{C} character from the path it
  was given. That path is a real location in the file system, so removing the
  control characters made it point to nothing and zipping the directory failed.
  All three call sites pass real paths, never entries inside the ZIP.

ascii() now maps control characters to an underscore as well, so they no longer
reach the file system, and normalizePath() only strips NUL bytes.

Mantis: https://mantis.ilias.de/view.php?id=30709

* [FIX] 45051: Missing "Read by Users" Information on File Info Page

Since ILIAS 9 the info page of a file object no longer shows the read
statistics, i.e. "Lesezugriffe registrierter Benutzer" and "Gelesen von
Benutzern (Anzahl)", nor the creation date and the owner.

buildInfoScreen() called hideFurtherSections(false) unconditionally. That marks
every section created afterwards as hidden and, because of the false, drops the
toggle that would unfold them again. ilInfoScreenGUI::addObjectSections() adds
its section while rendering, hence after that call, so "Additional Information"
was rendered with style="display:none;" and no way to reveal it.

The call comes from the kiosk mode implementation, where a lean info screen is
wanted, but unlike the other kiosk specific parts of the method it was never
guarded by $kiosk_mode. It is now, which restores the pre ILIAS 9 behaviour for
the regular info page and keeps the kiosk view unchanged.

Mantis: https://mantis.ilias.de/view.php?id=45051

* sync language files

* 0048153: enforce extraction limits in Unzip

Mantis: 0048153
Signed-off-by: Releasemanager <webmaster@ilias.de>

* Container: check if trash functions are called from administration

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Course: add missing permission checks in ilObjCourseGUI (48026)

Signed-off-by: Releasemanager <webmaster@ilias.de>

* fix plugin CSS/JS paths

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Tree: quote sort field in ilTreeTrashQueries (48128)

Signed-off-by: Releasemanager <webmaster@ilias.de>

* LTI: Enforce release settings access

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Course: add permission check for objectives settings (47893)

Signed-off-by: Releasemanager <webmaster@ilias.de>

* fixed 48067: Authenticated RCE via MediaPool

Signed-off-by: Releasemanager <webmaster@ilias.de>

* fixed 48152

Signed-off-by: Releasemanager <webmaster@ilias.de>

* fix(file): confine ilFileXMLParser COPY-mode path to the import dir

Signed-off-by: Releasemanager <webmaster@ilias.de>

* fix(soap): reject COPY/REST modes in ilSoapFileAdministration::addFile()

Signed-off-by: Releasemanager <webmaster@ilias.de>

* Release 10.10

---------

Signed-off-by: Releasemanager <webmaster@ilias.de>
Co-authored-by: Alexander Killing <killing@leifos.de>
Co-authored-by: iszmais <45942348+iszmais@users.noreply.github.com>
Co-authored-by: Uwe Kohnle <kohnle@internetlehrer-gmbh.de>
Co-authored-by: mjansen <mjansen@databay.de>
Co-authored-by: Thibeau Fuhrer <thibeau@sr.solutions>
Co-authored-by: Releasemanager <webmaster@ilias.de>
Co-authored-by: Stephan Kergomard <webmaster@kergomard.ch>
Co-authored-by: Sagun Karki <sagun.karki@minervis.com>
Co-authored-by: Abraham <abrahammordev@gmail.com>
Co-authored-by: Fabian Helfer <fhelfer@databay.de>
Co-authored-by: Stefan Meyer <meyer@leifos.de>
Co-authored-by: Fabian Helfer <82493694+fhelfer@users.noreply.github.com>
Co-authored-by: Ahmed Hamouda <ahm3dhamouda@gmail.com>
Co-authored-by: BettyFromHH <solzbacb@hsu.hamburg>
Co-authored-by: dkippKPG <daniel.kipp@kroepelin-projekte.de>
Co-authored-by: Tim Schmitz <schmitz@leifos.de>
Co-authored-by: Saúl Díaz <sauldiazdiaz210@gmail.com>
Co-authored-by: Ilja Lukin <ilja.lukin@fh-dortmund.de>
Co-authored-by: Sagun Karki <51822939+sKarki999@users.noreply.github.com>
Co-authored-by: Tim Schmitz <104776863+schmitz-ilias@users.noreply.github.com>
Co-authored-by: Fabian Schmid <fabian@sr.solutions>
Co-authored-by: André Schweigert (FAU) <162575681+andreschweigert@users.noreply.github.com>
Co-authored-by: Matthias Kunkel <mkunkel@me.com>
Co-authored-by: Fabian Wolf <wolf@ilias.de>
Co-authored-by: Lukas Eichenauer <47783030+lukas-heinrich@users.noreply.github.com>
Co-authored-by: Matheus Zych <mzych@databay.de>
Co-authored-by: Marvin Beym <79150442+mBeym@users.noreply.github.com>
Co-authored-by: Fred Neumann <neumann@ilias.de>
Co-authored-by: iszmais <iszmais@databay.de>
Co-authored-by: Andre Schweigert <andre.schweigert@fau.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accessibility Pull requests that propose A11Y changes. css/html Pull requests that propose changes to CSS/SCSS or HTML files. kitchen sink php Pull requests that update Php code translations Pull requests that propose changes to ILIAS language files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants