npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

customfields-projects-redmine

v0.1.1

Published

Redmine project overview based on projects' custom fields and wiki.

Downloads

2

Readme

paypal


Need

When an institution has to handle a great number of projects, it can be interesting for people having a transversal role (Chief Information Officer, Privacy Officer, Chief Financial Officer, etc.) to have a global overview without having to call every project manager. Let's take the example of a French Privacy Officer: he'd like to know the reference of the project's declaration, its date of declaration, the type of data he handles, etc. He doesn't need to know the detail of every project and it could be tedious to have to wait the answer of each project manager in his inbox when a question is submitted, whereas every information can be entered in a collaborative tool. It's this need that is satisfied here.

Intended users

This application is intended for people having a transversal role among projects. If these projects are already managed with Redmine, this won't change anything for project managers.

Requirements

  • NodeJS
  • Redmine

note: I haven't tested every verion, but I know that with nodeJS 8+ and Redmine 3.3.0+ the application works perfectly. Thanks for letting me know the versions you work with and whether the app is working or not.

How does it work?

The application checks if a project is eligible depending on a boolean custom field, and displays statistics and info.

Features

Header

In the header you can find the (parametrable) title, icons of the features and (parametrables) logos.

Menu icons

Home the home icon

This is a basic page explaining the features.

Project overview the project overview icon

It's a table showing projects' completion regarding the selected fields. You can export the table, select columns to display and even search the table. You can get to a project page by clicking on its name.

Project overview

Projects' statistics the stats icon

This page shows a global overview of custom fields' completion.

Projects' statistics

If you click on a stat (the green bar of a completed field or the red bar of an uncompleted field), the list of projects concerned by this stat is shown:

List of projects concerned by a stat

It is then possible to click on a project to get to its page.

Projects' wiki pages the wiki icon

This icon is not displayed if there is no wiki page configured. You have to select a project and a page.

Wiki pages of a project

If a wiki page doesn't exist, an error message is displayed indicating that the wiki page doesn't exist.

Wiki page doesn't exist

Project overview the project page icon

All the information of a project is shown here if it's correctly completed. It's possible to get to the Redmine of the project if you click its name, and you can print the page if you click on the printer.

Project overview

Create a project the project creation icon

It is a form automatically generated with configured custom fields:

Project creation form

Every input can be deleting by clicking on the black cross next to it; it is possible to reset the form by clicking on the red button.

Filled project creation form

If the project has been created, you'll get the following message:

Project created

Redmine configuration

You have to create in Redmine a boolean custom field associated to each project. As soon as a project will have this custom field set to "true", it will be displayed in the application:

Create an eligible custom field in Redmine

This custom field has to be "used as filter" and "searchable". My advice is to set the default value to "false" and not to make it required.

You can then create every custom field useful for the application.

For all these fields you have to get their id (a integer) because it's these ids you'll have to enter in the application configuration.

Application configuration

Installation

using NPM

...soon...

from Github

$ git clone https://github.com/djcaesar9114/customfields-projects-redmine
$ cd customfields-projects-redmine
$ npm install

Configuration

There are two elements to configure in the application:

  • the key used to contact Redmine API;
  • default.json and production.json configuration files in the /config folder.

Every time you change the configuration, you have to reload the application.

Redmine API key

The application needs the Redmine API key of a user having the rights to see all project information. My advice is to create a particular user such as "customfields-projects-redmine" and to use its key. When you have this key, create a file named redmineAPIKey.key in the application folder (i.e. in the same folder as index.js), and write the key as in this example:

var key = '9114934c4ce0bc97363ff3086983d576db08d115';
exports.key = key;

Why not put the key in the parameters? I'm used to never sharing identifiers granting access to personal data. Puttin the key in a separate file allows me to never communicate it accidentally if I publish a version of the application in which I left the key somewhere.

Configuration files

There is at least a configuration file to fill: default.json. If you have different settings in production, you have to fill production.json. Every variable found in production.json will replace those of default.json

{
  "Application":{
    // application port
    "port": 9114
  },
  "IHM": {
    // application title
    "titre": "Récapitulatif CNIL des projets",
    // [OPTIONAL] images in header, with height and link
    "images": [
      {
        "name": "cnil_logo-large.png",
        "title": "CNIL",
        "height": "20px",
        "link": "http://cnil.fr"
      },
      {
        "name": "djcaesar9114_logo_officiel_transparent.png",
        "title": "DJ Caësar 9114",
        "height": "20px",
        "link": "http://djcaesar9114.com"
      }
    ]
  },
  "Redmine": {
    // Redmine URL
    "url": "https://monredmine.url",
    // [OPTIONAL] maximum number of checked projects, 100 by default
    "maxProjets": 200,
    // id of the custom field used for eligibility of a project
    "champEligible": 18,
    // ids of the custom fields used in the application. Don't put ID_CHAMP_ELIGIBLE in it!
    "champRetenus": [16, 17, 19, 20, 21, 22, 23],
    // id of projects you don't want to appear in the list
    "projetsCendures": [20, 21],
    // [OPTIONAL] wiki pages of the projects
    "pagesWiki": [
      {
        titre: 'Informations traitées',
        url: 'Partie_1'
      },
      {
        titre: 'Mentions légales',
        url: 'Partie_2'
      }
    ]
  }
}

Launch the app

If you don't have any difference with default and production configuration, (i.e. you don't have production.json file), you can launch:

$ node index.js

If you have a difference, you have to set a variable first:

$ export NODE_ENV=production
$ node index.js

If you want to save log files, you can naturally do this:

$ node index.js >> /var/log/customfields-projects-redmine.log

Logs

The application is verbose:

  • [PROJET]: describes the action on a project:
    • éligible: the eligible project is taken;
    • non éligible: the ineligible project is not taken;
    • sauté: the project is not taken, whatever its eligibility is;
    • if no project is eligible, a message appears;
  • [ERREUR REDMINE]: describes the Redmine error encountered;
  • [CHAMP]: describes the custom field treated;
  • [TYPES CHAMPS]: JSON of all the custom fields and their information;
  • [FORMULAIRE] Envoyé: sent form information;
  • [ID GÉNÉRÉ]: created project's generated id;
  • [WIKI]: tells what wiki page is loaded and its HTML content.

Thanks

Thanks a lot to all of you on the internet (Stackoverflow, for example) who have answered my questions:

  • Ehsan for his really simple method to convert a date (and yes, I needed that!): https://stackoverflow.com/a/27087163/1098303
  • Dogbert for his technique on conditionnal classes in Pug: https://stackoverflow.com/a/14144327/1098303

The mysterious author of this article: http://www.finalclap.com/faq/257-javascript-supprimer-remplacer-accent

And of course the developers of the technologies I used:

  • Redmine: I'm a great fan of Redmine. I use it a lot, and not only for coding. Merci Jean-Philippe!
  • NodeJS: I think I will never write any PHP line now. Oh, except if I have to translate a script to Node;
  • Bootstrap: when you are CSS-challenged like me, it's really helpful;
  • node-redmine: it saved me a lot of time when it came to use Redmine API with Node;
  • express: very famous web framework;
  • pug: after having tried a lot of template engines, I finally have converted to this one;
  • textile-js: it saved me a lot of time, not really wanting to develop a Textile/HTML converter;
  • colors: to write beautiful logs;
  • body-parser: essential when it comes to form manipulation;
  • config: thanks for easing app configs...
  • dataTables: do I have to introduce this JS library outstandingly handling tables?
  • jspdf: allows you to save PDF from a page, but you'll prefer using printJS for complicated cases...
  • printJS: simplifies a lot printing, but beware of printing in a file to save the planet!
  • canvasJS: to draw beautiful charts.