Giter Club home page Giter Club logo

telefonia's People

Contributors

lucaslencinas avatar pslencinas avatar

Watchers

 avatar  avatar  avatar

telefonia's Issues

commitear lo que hice en el laburo

TODOs

-Agregar fechas y horas de creacion de tickets, mandarlas al server y guardarlas en la base
-Pensar en como se muestra la info adicional del ticket. Hay un log de cambios respecto al mismo? como se guarda en la base eso?

En altainterno.sql

departamento varchar(20) DEFAULT NULL,
CONSTRAINT chk_estado CHECK (estado IN ('rechazado', 'pendienteGerente', 'pendienteTelefonia', 'aprobado'))

En db.js

exports.buildGetServiciosDeUsuarioQueryString = function(tipoDeServicio, idUsuario){
var typesWhereClause = {
"aprobados":"AND estado = 'aprobado')",
"pendientes":"AND (estado = 'pendienteTelefonia' OR estado = 'pendienteGerente'))",
"rechazados":"AND estado = 'rechazado')",
"todos": ")"
};

var query = "SELECT idIBM, nombre, apellido, pais, ticket, estado, fManager, sManager, edificio, piso, intReferencia, aparato, voicemail, justificacion ";

query += "FROM altainterno ";
query += "WHERE (idIBM = '" + idUsuario + "' ";/le falta el cierre del parentesis, lo agrega la linea de abajo/
query += typesWhereClause[tipoDeServicio];

return query;
};

En servicios.js

router.get('/:tipoDeServicio/:idUsuario', function(req, res, next) {
console.log('Adentro de GET /servicios/' + req.params.tipoDeServicio + "/" + req.params.idUsuario );

db.getConnection(function(err, connection){
connection.query( db.buildGetServiciosDeUsuarioQueryString(req.params.tipoDeServicio, req.params.idUsuario), function(err, rows) {
if (err) {
throw err;
}
res.json(rows);
/*rows tiene:
idIBM, nombre, apellido, pais, ticket, estado, fManager, sManager, edificio, piso, intReferencia, aparato, voicemail, justificacion
*/
connection.release();
// Don't use the connection here, it has been returned to the pool.
});

});

res.send('respond with a resource');
});

Siguen estando los html viejos en el servidor

Es medio raro pero si se accede a telefonia.herokuapp.com se va a la pagina vieja. Pero si se accede a telefonia.herokuapp.com/index.html o login.html aparece lo nuevo. Ver si es problema del browser o de heroku o de nodejs

Mostrar descripcion del ticket

Los campos del ticket en un modal y los logs de cada uno. Diferenciar para los distintos usuarios:

  • Comunes
  • Managers
  • TelefoniaLocal
  • TelefoniaAdmin

Campos de altaInterno

@pslencinas fijate si la fuente de los datos es la correcta en cada caso, y que pasa con los que no se.

Alta Interno:

  • idIBM --> OK, del login
  • nombre --> OK, del login
  • apellido --> OK, del login
  • ticket --> OK, autoincremental
  • servicio --> Hace referencia al tipo de servicio solicitado (altainterno, altalineaanalogica..etc)
  • nivelAprobacion --> campo numérico (0-No requiere aprobación, 1-Requiere aprobación 1er Manager, 2- Requiere aprobación 2do Manager)
  • tipo --> ¿?
  • pais--> OK, del formulario
  • fechaInicio Es la actual del pedido
  • estado --> pendiente | rechazado | aprobado. Alguno mas?
  • idFManager --> me lo da el "Traer Datos"
  • fManager --> me lo da el "Traer Datos"
  • idSManager --> me lo da el "Traer Datos"
  • sManager --> me lo da el "Traer Datos"
  • fechaFManager --> Campo Fecha/Hora cuando el 1er Manager aprobó/rechazó la solicitud
  • fechaSManager --> Campo Fecha/Hora cuando el 2er Manager aprobó/rechazó la solicitud
  • fechaTelefonia --> Campo Fecha/Hora cuando el Administrador aprobó/rechazó la solicitud
  • fechaCerrado --> Campo Fecha/Hora cuando el Administrador aprobó/rechazó la solicitud
  • edificio --> OK
  • departamento --> me lo da el "Traer Datos"
  • piso --> OK, del formulario
  • intReferencia --> OK, del formulario
  • aparato --> OK, del formulario
  • voicemail --> OK, del formulario
  • discado --> es el tipo de discado que selecciono, del formulario.
  • justificacion --> OK, del formulario
  • interno --> Este campo lo completa el administrador de Telefonia. Asigna un número de interno
  • macAddress --> interno --> Este campo lo completa el administrador de Telefonia. Asigna un aparato físico detallado por su mac-address.
  • marca --> interno --> Este campo lo completa el administrador de Telefonia. Asigna Marca del teléfono
  • modelo --> interno --> Este campo lo completa el administrador de Telefonia. Asigna Marca del teléfono.
  • serie --> Idel anterior.
  • motivoFManager --> Si el Manager Rechazó la solicitud, le tiene que pedir un motivo. Este texto va aca.
  • motivoSManager --> Si el Manager Rechazó la solicitud, le tiene que pedir un motivo. Este texto va aca.
  • motivoTelefonia --> Si Telefonia Rechazó la solicitud, le tiene que pedir un motivo. Este texto va aca.

En el traer datos, tengo un "idLotusNote". Me sirve?

API de IBM

@pslencinas
Arme un mock de la API de IBM usando los servicios de Apidary para ir probando y hacer la consulta posta.
Por ahora solo puse un par de datos simples de prueba, pero trata de fijarte cuales faltan:
AL URL es esta: http://private-3cf3f-telefoniaibm.apiary-mock.com/users/admin
Para ir probando, en el login, voy a poner un select que te deje elegir como que te queres loguear, para que dependiendo de cada caso, te devuelva estos distintos campos.

Si haces un GET a estas direcciones ahora te devuelve lo que esta abajo:

GET --> [/users/admin] --> + Response 200 (application/json)
{
"nombre": "Agustin",
"apellido": "Administrador",
"idIBM": "admin123"
}

GET --> [/users/common] --> + Response 200 (application/json)
{
"nombre": "Carlos",
"apellido": "Comun",
"idIBM": "comun456"
}

GET --> [/users/telefonia] --> + Response 200 (application/json)
{
"nombre": "Tadeo",
"apellido": "Telefonia",
"idIBM": "telef789"
}

GET --> [/users/manager] --> + Response 200 (application/json)
{
"nombre": "Manuel",
"apellido": "Manager",
"idIBM": "manag123"
}

Transformar el localhost:8080 a una direccion posta

Hasta el momento puedo hacer que la aplicacion se pueda ejecutar y quedarse levantada.
Luego, si voy al Chrome o Mozilla, la accedo usando la direccion localhost:8080.
Como hago para que esa direccion, se transforme a algo del estilo www.serviceDeskTelefonia.com dentro de mi red local?
Con PM2 y nginx.
PM2 es para dejar corriendo procesos nodeJs.
nginx es una especia de proxy que redirecciona las busquedas de una red local hacia las aplicaciones a las que quiero acceder. No se si es exactamente lo que hace y como lo hace pero puede ir por ahi.
Un par de paginas explicando:

con que seguir

  • traer los tickets de un usuario
  • traer los tickets de un usuario manager
  • traer los tickets de los usuarios que responden a un manager.
  • agregar los campos nuevos en la table de ibm_data
  • agregar estado pendienteTelefoniaLocal y telefoniaAdmin. Se usa solo para altaInterno. El resto va a telefoniaAdmin
  • El gerente solo aprueba o rechaza. Podria modificar los campos que quisiese de ser necesario.
  • TelefoniaLocal agrega mac, marca, serie, modelo
  • Telefonia Admin agrega interno
  • Nivel de aprobacion, 0(no requiere, por ejemplo reseteo pass), 1(appr gerente1) ,2(appr gerente2)
  • fManager y sManager son nombres completos, entonces en la tabla usuarios debe ser nombre completo.
  • Crear tabla TelefoniaAdmin para saber quienes son admins con (rol, id,fullname,pais,mail, bla)
  • Si es TelAdmin, ve todo, no hay filtro de algun tipo. Peeero si es TelLocal ve los tickets que sean de su pais nada mas.
  • Crear tabla de logs con (ticket, tipodeServicio, idIBm, fullname, descripcion)

Info adicional del ticket

Pensar en como se muestra la info adicional del ticket. Hay un log de cambios respecto al mismo? como se guarda en la base eso?
@pslencinas como seria esto? Se muestra algun tipo de historial sobre un ticket?
Algo como:
4 de marzo --> Creacion de ticket
14 de marzo --> Pendiente de Gerente1
27 de marzo --> Pendiente de Telefonia
4 de abril --> Aprobado
El usuario ve esto, o solo el estado actual del ticket y listo?

Hacer que el Traer Datos consulte a mi base de datos

Pasandole el numero/Id de empleado, traer todos los datos para completar el div de la derecha:

  • Nombre:
  • Apellido:
  • ID de Lotus Note:
  • Departamento:
  • Gerente Nivel 1:
  • Gerente Nivel 2:

y tal vez alguno mas...

Ademas, se deberia bloquear todo el form de abajo, hasta que no se traigan los datos validados.

Definir todos los casos de uso de un usuario administrador

@pslencinas (Anda modificando este issue, agregando algunos items en cada caso)

  • Cosas que puede hacer un administrador?
    ** En general, puede hacer todo. Puede aprobar solicitudes sin que el Gerente lo haya hecho. Puede borrar registros. Puede modificar registros.
  • Cosas que puede hacer alguien que no es administrador ni usuario normal? Hay algun otro rol?
  • Los Gerentes tienen alguna otra funcionalidad?
    ** Pueden comportarse como usuarios normales para pedir sus servicios y puede aprobar/modificar las solicitudes de sus empleados.

scripts de ejemplos

/Insert Examples in different tables/

INSERT INTO empleados (idIBM, fullName, pais, idFManager, fManager, idSManager, sManager, rol, departamento, mail)
VALUES ( "lucas1", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "matias2", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "jonatan3", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "diego4", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "alicia5", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "luis6", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "roberto7", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "fede8", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "mariano9", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "martin10", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]"),
( "pablo11", "Pablo Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]");

/( "lucas1", "Lucas Lencinas", "Argentina", "jefe12", "Hernan Dominguez", "jefe34", "Patricia Fernandez", "comun", "finanzas", "[email protected]");/

INSERT INTO ibm_data (idIBM, password, fullName, isManager, pais, idFManager, fManager, mailFManager, idSManager, sManager, mailSManager, departamento, mail)
VALUES ( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),
( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),

/( "lucas1", "lucas1", "Lucas Lencinas", "N", "Argentina", "jefe12", "Hernan Dominguez", "[email protected]", "jefe34", "Patricia Fernandez", "[email protected]", "finanzas", "[email protected]"),/

acomodar la barra lateral

seleccion_028

Que al clickear ahi, solo muestre el resultado de esas solicitudes y no ejecute la accion de crear.
Solo Solicitudes de Servicios, no hay division.
tal vez No haga falta mostrar toda esa division especifica ahi --> Se podria hacer un filtro de Aprobadas, Rechazadas, Esperando confirmacion nada mas para los usuarios normales.

Armar API de pedidos a la base

Un comienzo...

  • GET, UPDATE, DELETE /usuario/userID
  • POST /usuarios {nuevoUsuario}
  • GET, UPDATE, DELETE /solicitud/id
  • POST /solicitudes {nuevaSolicitud}

Elementos de HTML

Horizontal form

Use Bootstrap's predefined grid classes to align labels and groups of form controls in a horizontal layout by adding .form-horizontal to the form (which doesn't have to be a

). Doing so changes .form-groups to behave as grid rows, so no need for .row.
Email
Password
Remember me

Email
Password
Remember me
Sign in

Supported controls

Examples of standard form controls supported in an example form layout.
Inputs

Most common form control, text-based input fields. Includes support for all HTML5 types: text, password, datetime, datetime-local, date, month, time, week, number, email, url, search, tel, and color.
Type declaration required

Inputs will only be fully styled if their type is properly declared.

Input groups

To add integrated text or buttons before and/or after any text-based , check out the input group component.
Textarea

Form control which supports multiple lines of text. Change rows attribute as necessary.

<textarea class="form-control" rows="3"></textarea>

Checkboxes and radios

Checkboxes are for selecting one or several options in a list, while radios are for selecting one option from many.

Disabled checkboxes and radios are supported, but to provide a "not-allowed" cursor on hover of the parent , you'll need to add the .disabled class to the parent .radio, .radio-inline, .checkbox, or .checkbox-inline.
Default (stacked)
Option one is this and that—be sure to include why it's great
Option two is disabled

Option one is this and that—be sure to include why it's great
Option two can be something else and selecting it will deselect option one
Option three is disabled

Option one is this and that—be sure to include why it's great
Option two is disabled
Option one is this and that—be sure to include why it's great
Option two can be something else and selecting it will deselect option one
Option three is disabled

Inline checkboxes and radios

Use the .checkbox-inline or .radio-inline classes on a series of checkboxes or radios for controls that appear on the same line.
1 2 3

1 2 3

1 2 3 1 2 3

Checkboxes and radios without label text

Should you have no text within the , the input is positioned as you'd expect. Currently only works on non-inline checkboxes and radios. Remember to still provide some form of label for assistive technologies (for instance, using aria-label).

Selects

Note that many native select menus—namely in Safari and Chrome—have rounded corners that cannot be modified via border-radius properties.

1 2 3 4 5

For controls with the multiple attribute, multiple options are shown by default. 1 2 3 4 5

Static control

When you need to place plain text next to a form label within a form, use the .form-control-static class on a

.
Email

[email protected]
Password

Password

Email

[email protected]
Password

Password
Confirm identity

Focus state

We remove the default outline styles on some form controls and apply a box-shadow in its place for :focus.
Demo :focus state

The above example input uses custom styles in our documentation to demonstrate the :focus state on a .form-control.
Disabled state

Add the disabled boolean attribute on an input to prevent user interactions. Disabled inputs appear lighter and add a not-allowed cursor.

Disabled fieldsets

Add the disabled attribute to a

to disable all the controls within the at once.
Caveat about link functionality of

By default, browsers will treat all native form controls (, and elements) inside a as disabled, preventing both keyboard and mouse interactions on them. However, if your form also includes <a ... class="btn btn-*"> elements, these will only be given a style of pointer-events: none. As noted in the section about disabled state for buttons (and specifically in the sub-section for anchor elements), this CSS property is not yet standardized and isn't fully supported in Opera 18 and below, or in Internet Explorer 11, and won't prevent keyboard users from being able to focus or activate these links. So to be safe, use custom JavaScript to disable such links. Cross-browser compatibility While Bootstrap will apply these styles in all browsers, Internet Explorer 11 and below don't fully support the disabled attribute on a . Use custom JavaScript to disable the fieldset in these browsers. Disabled input Disabled select menu Can't check this Disabled input

Disabled select menu Disabled select
Can't check this
Submit

Readonly state

Add the readonly boolean attribute on an input to prevent modification of the input's value. Read-only inputs appear lighter (just like disabled inputs), but retain the standard cursor.

Help text

Block level help text for form controls.
Associating help text with form controls

Help text should be explicitly associated with the form control it relates to using the aria-describedby attribute. This will ensure that assistive technologies – such as screen readers – will announce this help text when the user focuses or enters the control.
Input with help text
A block of help text that breaks onto a new line and may extend beyond one line.

Input with help text

...
A block of help text that breaks onto a new line and may extend beyond one line.

Validation states

Bootstrap includes validation styles for error, warning, and success states on form controls. To use, add .has-warning, .has-error, or .has-success to the parent element. Any .control-label, .form-control, and .help-block within that element will receive the validation styles.
Conveying validation state to assistive technologies and colorblind users

Using these validation styles to denote the state of a form control only provides a visual, color-based indication, which will not be conveyed to users of assistive technologies - such as screen readers - or to colorblind users.

Ensure that an alternative indication of state is also provided. For instance, you can include a hint about state in the form control's text itself (as is the case in the following code example), include a Glyphicon (with appropriate alternative text using the .sr-only class - see the Glyphicon examples), or by providing an additional help text block. Specifically for assistive technologies, invalid form controls can also be assigned an aria-invalid="true" attribute.
Input with success A block of help text that breaks onto a new line and may extend beyond one line.
Input with warning
Input with error
Checkbox with success
Checkbox with warning
Checkbox with error

Input with success A block of help text that breaks onto a new line and may extend beyond one line.
Input with warning
Input with error
Checkbox with success
Checkbox with warning
Checkbox with error

With optional icons

You can also add optional feedback icons with the addition of .has-feedback and the right icon.

Feedback icons only work with textual elements.
Icons, labels, and input groups

Manual positioning of feedback icons is required for inputs without a label and for input groups with an add-on on the right. You are strongly encouraged to provide labels for all inputs for accessibility reasons. If you wish to prevent labels from being displayed, hide them with the .sr-only class. If you must do without labels, adjust the top value of the feedback icon. For input groups, adjust the right value to an appropriate pixel value depending on the width of your addon.
Conveying the icon's meaning to assistive technologies

To ensure that assistive technologies – such as screen readers – correctly convey the meaning of an icon, additional hidden text should be included with the .sr-only class and explicitly associated with the form control it relates to using aria-describedby. Alternatively, ensure that the meaning (for instance, the fact that there is a warning for a particular text entry field) is conveyed in some other form, such as changing the text of the actual associated with the form control.

Although the following examples already mention the validation state of their respective form controls in the text itself, the above technique (using .sr-only text and aria-describedby) has been included for illustrative purposes.
Input with success (success)
Input with warning (warning)
Input with error (error)
Input group with success
@
(success)

Input with success (success)
Input with warning (warning)
Input with error (error)
Input group with success
@
(success)

Optional icons in horizontal and inline forms
Input with success
(success)
Input group with success
@
(success)

Input with success
(success)
Input group with success
@
(success)

Input with success (success)

Input group with success @
(success)

Input with success (success)
Input group with success
@
(success)

Optional icons with hidden .sr-only labels

If you use the .sr-only class to hide a form control's (rather than using other labelling options, such as the aria-label attribute), Bootstrap will automatically adjust the position of the icon once it's been added.
Hidden label
(success)
Input group with success
@
(success)

Hidden label (success)
Input group with success
@
(success)

Control sizing

Set heights using classes like .input-lg, and set widths using grid column classes like .col-lg-*.
Height sizing

Create taller or shorter form controls that match button sizes.

...
...
...

Horizontal form group sizes

Quickly size labels and form controls within .form-horizontal by adding .form-group-lg or .form-group-sm.
Large label
Small label

Large label
Small label

Column sizing

Wrap inputs in grid columns, or any custom parent element, to easily enforce desired widths.

Armar un DER

@pslencinas en algun momento creo que me habias mostrado un script de base de datos o el create de algunas tablas mas. Cuando puedas pasalas de nuevo, para guiarme mejor.

Contenido de la Barra superior

seleccion_027
Esas opciones estan para todos los tipos de usuarios?
Cuando puedas especificame que aparece en cada caso o eso lo decido yo?
Por ejemplo ahi aparece nuevo Servicio, pero no aparece nueva Solicitud. En la barra del costado tampoco:
seleccion_028

Cual seria la diferencia entre uno y el otro?
@pslencinas.
PD: Si contestas directamente el mail que te llega, con lo que escribiste se crea un comentario en este issue de github automaticamente.

Click en Servicios Pendientes

*@lucaslencinas *
Cuando haces click en Servicios Pendientes, la descripción en la página dice: Servicios Esperando Confirmación. Yo modifiqué esto pero no me funcionó. Fijate de tocarlo.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.