There is a plethora of options available when trying to solve the sticky table header problem.
and a mixed bag with many packages doing something in between.
All these solutions share the same problem: They remove the table headers from the browser's own width computation. If you have dynamic tables with cells that may change their widths as we do with our inline-editing functionality in OpenProject, the changing cells width will break the header widths since they are not in sync.
There is a draft spec for
a stickily positioning an element:
A few years ago,
position: sticky was available in Chrome when it still ran on webkit,
and Firefox introduced support with v32.0 back in 2014.
Chrome now recently introduced support for
position: sticky again in their own engine:
Read the original blog post here.
The interesting part is, in Chrome, sticky works on table header cells as well. This makes it the easiest CSS-only solution to sticky table headers that do not have the above width synchronization problem. If you plan to use it, there are some hefty caveats, however. Primarily, this concerns browser support.
Sunday, 20. August 2017
At a customer installation of OpenProject, Subversion is still widely as a document management solution. While I advocate against its use for large repositories of documents, its use in that area exists historically due to the availability of clients and well-known processes for many users in the area of software development.
User errors such as deleted files and folders occur regularly and can be fixed client side. The real trouble beings when we receive incidents of files being added to the repository by mistake.
Unlike Git, Subversion (by design) does not provide client-side means to rewrite history. On the server-side, there is an ancient change request on the Subversion project tracker with some discussions in the past decade, but it appears to be a hard problem and no real solution has been achieved thus far.
Instead of rewriting a single revision, you will have to play back the whole repository with a specific exclusion of the bad changesets.
Tuesday, 12. January 2016
For development environments with Docker, a fundamental requirement is the synchronization of host folders with a Docker container.
With it, a developer can employ the full power of the host to work on code locally, and instantly see these changes reflected inside the Docker container.
While Docker Compose includes a command to trivially define synchronized folders with the
volume command, development performance is impaired when the docker daemon is not running on the host itself—such as on OS X.
This post aims at giving an overview on the host volume performance impacts when running Docker on a non-Linux host.
This post assumes a basic understanding of the capabilities of Docker and Compose. This preceding post introduces the fundamentals of Docker if you are not familiar with the Docker stack yet.
Saturday, 30. May 2015
Docker has gained significant traction and stability since its beginnings in 2013.
My previous experience was that creating complex application containers with multiple services was complicated and full of workarounds.
Since then, Docker has taken over the linking tool Fig into Docker Compose, and has gained an interesting set of abstractions towards container orchestration.
Still, there are many pitfalls regarding Docker use in both development and production.
This post aims at giving an introduction to the possibilities of Docker and its limitations for isolated development environments.
Sunday, 3. May 2015
In this post, we extend our database schema with two more tables: Users
and Comments. This will demonstrate the use of relationships between
tables using DBIx::Class.
Sunday, 21. September 2014
In this post, we start versioning our database for upcoming changes in
the requirements of our app. To avoid replacing the schema and data
alltogether, we'll employ
DBIx::Class::Migration to create seamless
migration paths for the database.
Sunday, 21. September 2014
For my thesis, I'm employing Scrapy as a Crawler
for several Online Social Networks. It provides an extensive pipeline
for scraping, processing and storing pieces of information (or Items).
I found myself using the Item pipeline in a way that it wasn...
Friday, 29. August 2014
In this post we integrate the DBIx::Class schema we created last time
into our Mojolicious blog app.
Saturday, 12. April 2014
In this post we create a database schema for our blog with DBIx::Class
and scrape the surface of its capabilities.
Thursday, 10. April 2014
In this third post we introduce forms for user login to the blog app and
handling of that login form's GET and POST request data.
Tuesday, 8. April 2014