On a cold December night we met at the Industry Lab to celebrate the Worc'n group and our membership in the cooperatives we belong to. The crowd was very energetic and several small groups were conversing on different topics throughout the evening. A holiday party is a time to see old friends and make new friends.
A cooperative is a structure to make new connections and share ideas. What better mix for a party. 2014 ended on a high note as the cooperative movement gains ground in Cambridge, MA. Worc'n (the Worker-Owned and Run Cooperative Network of Greater Boston) has been around for years and has an impressive number of cooperatives and owner-workers among their members. This party was sort of a merging of groups in the sense that Worc'n has been around for a long time, growing a membership and creating value.

The Boston/Cambridge Worker-ownership Meetup just started a few months ago, but through the network of local cooperatives, the word spread quickly and people have been expressing their happiness that there are now some meetngs to attend and new people to network with. The party was a Pot Luck and everyone brought something to share. There were homemade cookies, cakes and pie. We also were fortunate to have Monica Leitner-Laserna of La Sanghita Cafe attend the party with some delicious vegan foods from her newly formed cooperative restaurant in East Boston.

La Sanghita Cafe is Boston's only cooperative restaurant and they have a great vegan menu. Located just outside Maverick Square in East Boston, the restaurant is open daily for lunch and Wednesday through Saturday they offer a dinner menu. The menu is filled with sweet and savory items and the space is so comfortable and cozy. We look forward to having the coop members as guests at our monthly cooperative worker/owner meetup, to share the details on how it works to build a cooperative restaurant. Good food, good conversation and many engaging in discussion on topics involving cooperation, a wonderful evening was had by all. We should do this more often.
When one starts working with migrations, it is easy to be overwhelmed by so many modules providing migration functionality. Throughout the series, we presented many of them trying to cover one module at a time. We did this to help the reader understand when a particular module is truly needed and why. But we only scratched the surface. Today’s article presents a list of migration related Drupal modules, all good for Drupal 8, for quick reference. Let’s get started.
At the time of this writing, Drupal core ships with four migration modules:
Once the migration definition files have been created, there are many options to execute them:
The Migrate API offers many options to fetch data from:
The Migrate API is mostly used to move data into Drupal, but it is possible to write to other destinations:
These modules can help with writing Drupal migrations:
While doing the research for this article, we found many useful modules created by Tess Flynn (socketwench). She is a fantastic presenter who also has written about Drupal migrations, testing, and much more. Here are some of her modules:
What did you learn in today’s blog post? Did you find a new module that could be useful in current or future projects? Did we miss a module that has been very useful to you? Share your answers in the comments. Also, I would be grateful if you shared this blog post with others.
Next: Introduction to Drupal 8 upgrades
This blog post series, cross-posted at UnderstandDrupal.com as well as here on Agaric.coop, is made possible thanks to these generous sponsors: Drupalize.me by Osio Labs has online tutorials about migrations, among other topics, and Agaric provides migration trainings, among other services. Contact Understand Drupal if your organization would like to support this documentation project, whether it is the migration series or other topics.
Creating an issue fork to contribute to a Drupal module, without getting confused.
(This cheat sheet is for myself. Fellow cheaters welcome.)
Check the branch that the issue is against— even if you filed the issue yourself, it should have defaulted to the branch people should be working on.
Go to the module page and scroll down, if you are lucky there will be a dev release toward the bottom, for example "Development version: 2.0.x-dev", which you can click into and copy the composer command.
(If there is not a dev release, you'll have to look at Development in the sidebar, click through "Source code" and copy from the Code dropdown either the URL under Clone with SSH or Clone with HTTPS, and git clone that into a modules.
Press the Create issue fork button and wait a minute.
Press the "Show commands" link, and copy-paste the commands in the Add & fetch this issue fork’s repository
And then copy-paste the commands from Check out this branch for the first time
Assign to yourself in "Issue metadata fieldset and save the issue form with any comment about how you plan to work on this that you hope somebody might provide feedback on or as a reminder to your later self.
Talk about web components has been going for quite some time now: the term was coined in 2011. In this blog post, I will discuss the basics of what they are and what they do, and introduce the primary technological foundations for them. In future articles, I'll dig into the specifics and sample code - as they are currently supported or else poly-filled for today.
Web Components are a group of related standards promising to bring component-based extensibility to HTML documents. The great promise is that once you or someone else builds some component that provides a particular feature, it can easily be included and reused in other projects. For example, if you've created, say, a "treeview" component that displays data in a tree form, you can wrap up the definition of this in a component. Then, it would be possible for anyone to include the component easily wherever they might want to use a treeview. We'll ultimately get to defining our own components in a future article, but for now, let's look at a special sort of "built-in" web component.
Perhaps the most common HTML element that comes up when discussing web components is: the video tag. This is because the video tag offers a simple and very clear browser-native example of precisely what a web component looks like from the point of view of a consumer of a particular of a web component. If we were to include a video tag in a page, we don't end up with a naked auto-paying video display (by default). Instead, we end up with a nice little video player, complete with start/stop/seek and volume controls offered up by our browser:
In our browser (which again, in this case is Chromium), we can select the developer tools option under the General section / Elements titled "Show user agent shadow DOM." Given this option is set, we are able to see how Chromium builds upon the video tag when it is rendered:

As you can see, beneath the video element comes one of the core pieces of the Web Components technologies: the shadow-root. Chromium has treated the video tag as a "shadow host" which is a containing element for a "shadow root", off of which hangs the implementation of the video element's controls. This shadow host/shadow root mechanism is the basis for encapsulation in web components: it separates the details of an element's implementation from the outside document. CSS styles and JavaScript inside the shadow root are scoped to that element. Inside of the shadow root, the implementation of the video tag is a sub-tree of elements which is not directly inline with the the document's top-level DOM. This means, for example, you can neither find nor directly address elements within the shadow root.
There are at least a few libraries that enable building web-components for current browsers, regardless of browser support for the standards-based web components support. The one I'll demonstrate quickly here is pulled directly from polymer's home page. I'm using this because it demonstrates what I believe is about as close to the implementation of the ideal for web components (from a consumer perspective) aside from having to use a polyfill for some browsers today:
<!-- Polyfill Web Components support for older browsers --> <script src="components/webcomponentsjs/webcomponents-lite.min.js"></script> <!-- Import element --> <link rel="import" href="components/google-map/google-map.html"> <!-- Use element --> <google-map latitude="37.790" longitude="-122.390"></google-map>
Again, the polyfill ensures that our browser will handle the subsequent tags. This library aims to support the core web components features in a way that is consistent with the core web-components as the standards evolve. The link tag is another standard web component feature, though Mozilla is not favoring supporting it further, that essentially imports an external definition which in this case is the definition of the
Hopefully this gives you a quick glimpse into how web components might make our web applications grow through a variety of new interface tools we can build on, extend, and easily utilize. In future articles, we'll look at examples of using the various building blocks of web components, and how the technology continues to evolve.
Ben and Micky spoke at DrupalCon Seattle 2019 and New England Drupal Camp 2019 about scaling community conversations and decision-making. Rather than having slides of fine print and links, we're posting resources here in this blog post.
Here's a short-enough-to-write-on-a-business-card link for this page – agaric.coop/scaling-community – for easier sharing these resources with others.
We are excited to tailor private trainings to suit your needs. Here you will get an idea of the types of private trainings we have given before and would love to give again.
Let us know if you have any questions or special requests
We love to introduce people to Drupal's basics. We offer short introductory seminars for small groups on an on-demand basis for site building, templating, and developing extensions. Each seminar incorporates when appropriate the information architecture, user experience testing, and leadership and collaboration techniques needed to make any project a success.
We teach development teams and solo coders in-person or online, with the program tailored to the problems you are trying to solve. We have provided such capacity-building in Drupal programming, theming and templating, data migration, JavaScript frameworks, and more— and we are always upping our technology skills, so let us know what you are looking for and we may be just ahead of you on the learning curve— and ready to throw down a rope ladder, or at least a grappling hook.
In addition, we offer courses with a defined curricula on building, theming, and developing sites. And we give decision-maker seminars for leaders who need a better understanding of the technology underlying their projects.
350.org is a global climate justice organization that helped organize the largest climate strike in history. Together we improved their Climate Justice Action Map (CJAM) in the lead up to the strike so that activists could better mobilize their communities.
Benjamin Melançon of Agaric helped with a patch for the Drupal 7 version of Insert module.
Last week we were asked to disable the "threads" in the comments and display them as a plain list in one of our projects, so checking in the Comment field settings we found an option which says:
"Threading: Show comment replies in a threaded list."
Which basically display the comments as a threaded instead of a list of comments. This option is marked on by default, so it seemed that it was just a matter of unchecking this option, but there was a problem with this, that setting did display the comments as a plain list, but in the code they were still being saved as a thread.
The main problem with this is if a comment is deleted and it has replies (even if the option of the thread is unchecked) all the replies are going to be deleted as well.
This is not a new problem there is an 11 year old issue and it seems that this has been happening since Drupal 4. The way to fix this so far was by using a contrib module called: Flat Comments The problem is that this module hasn't been ported to D8 yet.
We decided to fix that and port the module to help others with this problem. You can check the code here: https://github.com/agaric/flat_comments and we are in contact with the module's maintainer to create the D8 branch in drupal.org soon.
Expecting that this can help someone else.
Post information about public spaces
Let residents know what public spaces are available for use in their area.
Notas:
Diapositivas - https://github.com/fiqus/FIT-talk-en
## FACTTIC - Federación Argentina de Cooperativas de Trabajo de Tecnología, Innovación y Conocimiento
* Lista de correo sólo para miembros
* Mattermost (chat de código abierto)
* Reunión mensual de la junta virtual (cualquier miembro puede asistir)
* Reuniones anuales cara a cara
## FIT
* Un proyecto dentro de FACTTIC donde las cooperativas comparten el estado de los proyectos en los que están trabajando
* Evolucionado a un área donde las cooperativas comparten proyectos
* Para unirse a la FIT, tienes que ser un miembro FACTTIC
* Reuniones virtuales mensuales
* Canal Mattermost para el diálogo en curso
* Las cooperativas tienen diferentes habilidades/servicios, pero cuando hay superposición, trata de no competir entre sí y determina las "necesidades" de cada cooperativa.
### Escenario 1: El proyecto demanda más trabajadores de los que tiene la cooperativa
* Cuando hay una necesidad de ayuda, el proyecto se comparte en FIT
* Las cooperativas pueden solicitar unirse al proyecto
* Los candidatos son evaluados y uno es elegido
* El cliente es informado y debe estar de acuerdo
* La coordinación del proyecto está dirigida por la cooperativa inicial
* El acuerdo comercial es manejado sólo por la cooperativa inicial
### Escenario 2: El cliente necesita que se haga el trabajo, pero Coop decide no tomarlo
* Esto podría suceder porque la cooperativa inicial no tiene los recursos o declina por una razón estratégica
* El proyecto se comparte con la FIT
* Si no hay cooperativas interesadas, se le dice al cliente que no hay nadie disponible.
* Si una cooperativa está interesada, el contacto de esa cooperativa se comparte con el cliente.
* Si más de una cooperativa está interesada, entonces preguntamos, ¿este proyecto requiere más de un trabajador?
* Si sólo necesita un trabajador, entonces la cooperativa que más lo necesita lo recibe.
* Si requiere más de un trabajador, entonces las cooperativas se coordinan entre sí para completar el trabajo.
## Case Studies
### Betterez
* Cliente canadiense
* Plataforma de gestión de reservas y billetes
* Tecnologías: MongoDB, NodeJS, VueJS y Elixir
* Necesitaba más trabajo del que Fiqus podía proporcionar
* 30 desarrolladores con 7 cooperativas diferentes
* Fiqus maneja las cuestiones financieras como las diferentes tarifas de los diferentes servicios
### Receptivi
* Cliente canadiense
* La página web muestra en tiempo real las percepciones psicológicas del personal
* Tenía más trabajo, pero Fiqus se negó a asumir el trabajo
* El trabajo se compartió en la FIT
* 3 desarrolladores de 2 cooperativas
### Mall Plaza
* Cliente chileno
* Aplicación móvil que muestra los servicios del centro comercial
*Técnica: Reaccionar Nativo, PostgreSQL, Frasco
## Onapsis
* Cliente argentino
* Sistema web que muestra alertas de vulnerabilidad en los servidores
* 2 cooperativas
## FIT Internacional
* Queremos replicar este modelo a nivel internacional.
1. Compartir este modelo con otros a fin de mejorarlo y difundir la conciencia
* Presentando en el Show and Tell
2. Construir relaciones de confianza
3. Conocerse en persona, pasar tiempo juntos
* Viajando al Reino Unido, reunión con la federación, COTECH
* Compartir experiencias después del viaje
## Preguntas y respuestas:
P: ¿Alguna vez ha tenido la resistencia de un cliente al entregar el trabajo a otra cooperativa?
R: Hay veces que los clientes no entienden las cooperativas y la cooperación entre ellas. Explicamos el beneficio y compartimos estudios de casos. Si hay una fecha límite que debe cumplirse, es más rápido traer un equipo con experiencia previa trabajando con la empresa original que tratar de encontrar una empresa completamente diferente.
P: ¿Cuánto comparten acerca de las múltiples cooperativas que trabajan en un proyecto?
R: Si son sólo unas pocas horas, no vale la pena hablar de ello. Sin embargo, la mayoría de las veces es importante compartir esa información y usarla como una oportunidad educativa para demostrar la fuerza de las cooperativas trabajando juntas.
* Una vez que los clientes ven el resultado de la cooperación se dan cuenta de que es una buena manera de enfocar el trabajo.
* La simplicidad del proceso es hermosa.
P: ¿Cómo se comparten los costos de desarrollo de los negocios?
R: La cooperativa que comparte el proyecto puede bajar sus tarifas durante el proceso de aceleración.
* Este es un aspecto que podría mejorarse.
* Lo más importante es ser transparente y comunicar mucho.
* Mantener el espíritu de generosidad fluyendo.
* Cuando la cooperación es exitosa, se construye la confianza con el cliente.
* Usar una herramienta para analizar los presupuestos y el progreso de los proyectos y prever la disponibilidad.
* La cooperación también asegura la calidad, los trabajadores de confianza se unirán al proyecto.
Drupal's toolbar second level of menu options and dropdown not showing? Look for "Uncaught DOMException: The quota has been exceeded." errors, as viewable in the Firefox web console. If you see them, the problem is likely due to sites sharing a top-level domain—which is likely if you are using a local development environment like DDEV, and you working on way too many sites at once—combined with a pretty bad Firefox bug that will be fixed in the next release.
To quote Nathan Monfils:
- Everything from your public domain (abc.tld) counts against your quota, even if it is in a seemingly unrelated subdomain (e.g. my-app.example.com and intranet.example.com).
- The quota is not recomputed properly, requiring a firefox restart after clearing your data on other subdomains
Note this may affect all sorts of applications, not just Drupal, when you have them running on multiple subdomains of the same top-level domain. So this isn't just about local development environments (and i dislike that DDEV shares their own top-level domain across all the instances you are working on, and while it can be changed i've accepted its way of doing things so i'm on the same page with other developers by default).
Sure, closing more tabs and restarting Firefox could (predictably) have fixed this—and a lot else that's wrong with me, according to everyone i know—but why do that when i can open more tabs and learn precisely how broken everything around me really is?

Agaric is facilitating a full day training at DrupalCon Seattle to help you understand how to import content into your to Drupal 8 website. It's the latest in our series of migration trainings.
This training is open for attendees with intermediate experience with Drupal– familiarity with installing a Drupal site and installing modules. We will use the Migrate API and related modules, which allows users to migrate content without writing any code.
With six instructors we will ensure no one gets left behind. Instead everyone will get the attention they need.
Attendees will learn to:
The training price is $450. Space is limited so we do encourage registering as soon as possible to ensure your spot.
As a web development cooperative that champions free software, we're passionate about migrations. It is a way to better understand Drupal's codebase, tap into the power of new features and build community. We have successfully migrated multiple sites to Drupal 8 and look forward to sharing our experience with you.
This training has sold out but please get in touch to be the first to know about future opportunities!