Add initial Cython pyx file for glsl-parser

# distutils: language = c++
# distutils: extra_compile_args = -fno-rtti -fno-exceptions

from enum import IntEnum

from libcpp cimport bool
from libcpp.vector cimport vector
from cython.operator import dereference

class ShaderType(IntEnum):
    Compute = 0
    Vertex = 1
    TessControl = 2
    TessEvaluation = 3
    Geometry = 4
    Fragment = 5

cdef extern from '../glsl-parser/ast.h' namespace 'glsl':
    cdef cppclass astType:
        bool builtin

    cdef cppclass astBuiltin:
        int type

    cdef cppclass astFunction:
        char* name
        astType* returnType
        bool isPrototype

    cdef cppclass astTU:
        astTU(int type)
        vector[astFunction*] functions

cdef extern from '../glsl-parser/parser.h' namespace 'glsl':
    cdef cppclass parser:
        parser(const char* source, const char* fileName)
        astTU* parse(int type)
        const char* error() const

cdef class Parser:
    cdef parser* c_parser

    def __cinit__(self, source, filename=''):
        self.c_parser = new parser(source.encode(), filename.encode())

    def __dealloc__(self):
        del self.c_parser

    def parse(self, shader_type):
        c_ast = self.c_parser.parse(int(shader_type))
        if c_ast:
            ast = Ast()
            ast.c_ast = c_ast
            return ast
        else:
            return None

    def error(self):
        return self.c_parser.error().decode()

cdef class Ast:
    cdef astTU* c_ast

    def functions(self):
        for c_function in self.c_ast.functions:
            func = Function()
            func.c_function = c_function
            yield func

cdef class Type:
    # TODO, not sure how this is supposed to be done
    cdef astType* c_type

    def builtin(self):
        return self.c_type.builtin

    def __repr__(self):
        if self.builtin():
            c_builtin = <astBuiltin*>(self.c_type)
            return 'TODO, typen={}'.format(c_builtin.type)
        else:
            raise NotImplementedError()

cdef class Function:
    cdef astFunction* c_function

    def name(self):
        return self.c_function.name.decode()

    def is_prototype(self):
        return self.c_function.isPrototype

    def return_type(self):
        typ = Type()
        typ.c_type = self.c_function.returnType
        return typ

    def __repr__(self):
        body = ';' if self.is_prototype() else '{...}'
        return '{ret} {name}(){body}'.format(ret=self.return_type(),
                                             name=self.name(),
                                             body=body)


cdef public int broadcast_arrays(list arrays, tuple broadcast_shape, int ndim,
                                 cnp.npy_intp **shape_out,
                                 cnp.npy_intp **strides_out) except -1:
    """
    Broadcast the given arrays. Returns the total broadcast shape of size
    ndim in shape_out. Returns the strides for each array in strides_out
    in an array of size len(arrays) * ndim.

    Note: Leading broadcasting dimensions should not have strides if the
          minivect function was compiled using an array type with less
          dimensions than `ndim`. Instead, the actual strides should be given
          without leading zero strides.
    """
    cdef cnp.ndarray array
    cdef int i, j, start, stop

    cdef cnp.npy_intp *shape = <cnp.npy_intp *> stdlib.malloc(
                                              ndim * sizeof(cnp.npy_intp))
    cdef cnp.npy_intp *strides_list = <cnp.npy_intp *> stdlib.malloc(
                                len(arrays) * ndim * sizeof(cnp.npy_intp))

    if shape == NULL or strides_list == NULL:
        raise MemoryError

    # Build a shape list of size ndim
    for i in range(ndim):
        shape[i] = broadcast_shape[i]

    # Build a strides list for all arrays of size ndim
    for i, array in enumerate(arrays):
        start = i * ndim

        if array.ndim < ndim:
            # broadcast leading dimensions
            for j in range(start, start + ndim - array.ndim):
                strides_list[j] = 0
            start = j

        for j in range(ndim):
            if array.shape[j] == 1:
                strides_list[start + j] = 0
            else:
                strides_list[start + j] = cnp.PyArray_STRIDE(array, j)

    # for j in range(ndim):
    #     print 'shape%d:' % j, shape[j]

    # for i in range(len(arrays)):
    #     for j in range(ndim):
    #         print 'stride%d:' % j, strides_list[i * ndim + j]
    #     print

    shape_out[0] = shape
    strides_out[0] = strides_list
    return 0

cdef public bint is_broadcasting(list arrays, broadcast) except -1:
    for array in arrays:
        if broadcast.nd != array.ndim or array.shape != broadcast.shape:
            return True

    return False


Add corner case temp (de)allocation test.

__doc__ = """
   >>> B().coeffs_bitsize()
   [2]
"""

cdef class A:
    def numerator(self):
        return self

cdef int  bitsize(A a):
    return 1

coeffs = [A()]

class B:
    def coeffs_bitsize(self):
        r = [bitsize(c.numerator())+1 for c in coeffs]
        return r


# mode: run
# tag: cpp, werror, cpp11

from libcpp cimport nullptr
from libcpp.memory cimport shared_ptr, make_shared
from libcpp.utility cimport move
from cython.operator cimport dereference

cdef extern from *:
    """
    #include <string>

    template<typename T> const char* move_helper(T&) { return "lvalue-ref"; }
    template<typename T> const char* move_helper(T&&) { return "rvalue-ref"; }
    """
    const char* move_helper[T](T)

def test_move_assignment():
    """
    >>> test_move_assignment()
    """
    cdef shared_ptr[int] p1, p2
    p1 = make_shared[int](1337)
    p2 = move(p1)
    assert p1 == nullptr
    assert dereference(p2) == 1337

def test_move_func_call():
    """
    >>> test_move_func_call()
    """
    cdef shared_ptr[int] p
    assert move_helper(p) == b'lvalue-ref'
    assert move_helper(move(p)) == b'rvalue-ref'


Add simple test for cdef override warning

# mode: error
# tags: werror

cdef foo():
    pass

def foo():
    pass

_ERRORS = u"""
7:0: 'foo' redeclared
7:0: Overriding cdef method with def method.
"""


# coding=utf-8
__doc__ = u"""
    >>> do_slice(u'abcdef', 2, 3)
    (u'c', u'cdef', u'ab', u'abcdef')
    >>> do_slice(u'abcdef', 0, 5)
    (u'abcde', u'abcdef', u'', u'abcdef')
"""

import sys

if sys.version_info[0] >= 3:
    __doc__ = __doc__.replace(u"(u'", u"('").replace(u" u'", u" '")

def do_slice(unicode s, int i, int j):
    return s[i:j], s[i:], s[:i], s[:]


from .parser cimport Parser
from ..structs cimport TokenC
from thinc.typedefs cimport weight_t

cdef class BeamParser(Parser):
    cdef public int beam_width
    cdef public weight_t beam_density

    cdef int _parseC(self, TokenC* tokens, int length, int nr_feat, int nr_class) except -1


Add run test for type ctypedef and PyType_IsSubtype.

from cpython.type cimport PyType_IsSubtype

class mylist(list): pass

def test_issubtype(a, b):
    """
    >>> test_issubtype(mylist, list)
    True
    >>> test_issubtype(mylist, dict)
    False

    >>> o = object()
    >>> test_issubtype(o, list)
    Traceback (most recent call last):
    ...
    TypeError: Cannot convert object to type
    """
    return PyType_IsSubtype(a, b)


Add ByteRange/StringPiece Conversion for Cython

cdef extern from "folly/Range.h" namespace "folly":
    cdef cppclass Range[T]:
        Range()
        Range(T, int)
        T data()
        int size()

ctypedef Range[const char*] StringPiece
ctypedef Range[const unsigned char*] ByteRange

ctypedef fused R:
    StringPiece
    ByteRange

# Conversion Helpers
cdef inline bytes to_bytes(R range):
    return <bytes>range.data()[:range.size()]


Add prototype for method overriding from Python

"""
This demo depicts how we can support overriding of numba methods in python.
In Cython, cpdef methods check to see if the object has a dict, and if so
look up the method at runtime and dispatch if found:

    cpdef mymethod(self):
        if hasattr(self, '__dict__'):
            return self.mymethod()

        <method body>

This is needed for calls that go through the vtable, and hence hit the
inherited Cython version, but not the Python one (see the 'obj.mymethod' call
of a typed object below in 'func').

We can use a metaclass to detect overridden methods and patch the vtable (
create a new one for each class). We can further detect monkey-patching on
the class and instances through descriptors:

    * monkey patches on the class mutate the vtable
    * monkey patches on the object create a new object-specific vtable
        - or perhaps are simply disallowed
"""

import ctypes

from cpython cimport PyObject

cdef extern from *:
    ctypedef unsigned int Py_uintptr_t

    struct __pyx_obj_4test_Base:
        void *__pyx_vtab

    ctypedef struct PyTypeObject:
        PyObject *ob_type

cdef mymethod_wrapper(self, int arg):
    self.mymethod(<object> arg)

class VTable(ctypes.Structure):
    _fields_ = [('mymethod', ctypes.c_void_p)]

cdef class MetaClass(type):

    cdef public object vtable

    def __init__(self, name, bases, dict):
        if "mymethod" in dict:
            mymethod_p = <Py_uintptr_t> &mymethod_wrapper
            self.vtable = VTable(ctypes.c_void_p(mymethod_p))
        else:
            self.vtable = None

# --- Test classes ---

cdef class Base(object):
    cdef mymethod(self, int arg):
        print "mymethod in Base", arg

(<PyTypeObject *> Base).ob_type = <PyObject *> MetaClass

class Derived(Base):
    def __init__(self):
        cdef Py_uintptr_t vtable_p

        vtable = type(self).vtable

        if vtable is not None:
            vtable_p = ctypes.addressof(vtable)
            (<__pyx_obj_4test_Base *> self).__pyx_vtab = <void *> vtable_p

    def mymethod(self, int arg):
        print "mymethod in Derived", arg

cdef func(Base obj):
    obj.mymethod(10)

func(Base()) # prints: mymethod in Base 10
func(Derived()) # prints: mymethod in Derived 10


from ..config cimport translate_exception
from .callable cimport callable

cdef extern from "dynd/functional.hpp" namespace "dynd::nd::functional" nogil:
    callable apply(...) except +translate_exception


Add reload(module) test that checks the current module singleton property.

# mode: run
# tag: pep489

import reload_ext_module

def test_reload(module):
    """
    >>> module = test_reload(reload_ext_module)
    >>> module is reload_ext_module  # Py_mod_create enforces a singleton.
    True
    """
    return reload(module)


Add a dedicated test for and/or operators in a boolean context.


Implement test for new PyMem_RawMalloc() functions.

# mode: run
# tag: c-api

from cpython cimport mem

def test_pymalloc():
    """
    >>> test_pymalloc()
    3
    """
    cdef char* m2
    cdef char* m = <char*> mem.PyMem_Malloc(20)
    assert m
    try:
        m[0] = 1
        m[1] = 2
        m[2] = 3
        m2 = <char*> mem.PyMem_Realloc(m, 10)
        assert m2
        m = m2
        return m[2]
    finally:
        mem.PyMem_Free(m)

def test_pymalloc_raw():
    """
    >>> test_pymalloc_raw()
    3
    """
    cdef char* m
    cdef char* m2 = NULL
    with nogil:
        m = <char*> mem.PyMem_RawMalloc(20)
        if not m:
            raise MemoryError()
        try:
            m[0] = 1
            m[1] = 2
            m[2] = 3
            m2 = <char*> mem.PyMem_RawRealloc(m, 10)
            if m2:
                m = m2
            retval = m[2]
        finally:
            mem.PyMem_RawFree(m)
    assert m2
    return retval


# tag: cpp
# mode: compile

cdef extern from "templates.h":
    cdef cppclass TemplateTest1[T]:
        TemplateTest1()
        T value
        int t
        T getValue()

    cdef cppclass TemplateTest1[T]


Add dedicated test file for read-only memory views.

# mode: run
# tag: readonly, const, numpy

import numpy as np

def new_array():
    return np.arange(10).astype('float')

ARRAY = new_array()

cdef getmax(double[:] x):
    """Example code, should work with both
    ro and rw memoryviews"""
    cdef double max_val = -float('inf')
    for val in x:
        if val > max_val:
            max_val = val
    return max_val

cdef update_array(double [:] x):
    """Modifying a ro memoryview should raise an error"""
    x[0] = 23.

cdef getconst(const double [:] x):
    """Should only accept ro memoryviews"""
    return x[0]

def test_mmview_rw(x):
    """
    >>> test_mmview_rw(ARRAY)
    9.0
    """
    return getmax(x)

def test_mmview_ro(x):
    """
    >>> test_mmview_ro(new_array())
    9.0
    """
    x.setflags(write=False)
    assert x.flags.writeable is False
    return getmax(x)

def test_update_mmview_rw(x):
    """
    >>> test_update_mmview_rw(new_array())
    23.0
    """
    update_array(x)
    return x[0]

def test_update_mmview_ro(x):
    """
    >>> test_update_mmview_ro(new_array())
    0.0
    """
    x.setflags(write=False)
    assert x.flags.writeable is False
    try:
        update_array(x)
    except ValueError: pass
    else:
        assert False, "RO error not raised!"
    return getconst(x)

def test_rw_call_getmax(double[:] x):
    """
    >>> test_rw_call_getmax(new_array())
    23.0
    """
    update_array(x)
    assert getconst(x) == 23
    return getmax(x)

def test_const_mmview_ro(x):
    """
    >>> test_const_mmview_ro(new_array())
    0.0
    """
    x.setflags(write=False)
    assert x.flags.writeable is False
    return getconst(x)


Add PyDASPK wrapper file for DASPK solver required for sensitivity analysis.

# -*- coding: utf-8 -*-

################################################################################
#
#   PyDAS - A Python wrapper for several differential algebraic system solvers
#
#   Copyright (c) 2010-2014 by Joshua W. Allen (jwallen@mit.edu)
#   and Connie W. Gao (connieg@mit.edu)
#
#   Permission is hereby granted, free of charge, to any person obtaining a
#   copy of this software and associated documentation files (the 'Software'),
#   to deal in the Software without restriction, including without limitation
#   the rights to use, copy, modify, merge, publish, distribute, sublicense,
#   and/or sell copies of the Software, and to permit persons to whom the
#   Software is furnished to do so, subject to the following conditions:
#
#   The above copyright notice and this permission notice shall be included in
#   all copies or substantial portions of the Software.
#
#   THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#   DEALINGS IN THE SOFTWARE.
#
################################################################################

import numpy as np
cimport numpy as np

cdef class DASPK:

    cdef public int maxOrder
    cdef public object tstop
    cdef public double initialStep
    cdef public double maximumStep
    cdef public object bandwidths
    cdef public bint nonnegative
    cdef public bint sensitivity
    cdef public int sensmethod

    cdef public double t
    cdef public np.ndarray y
    cdef public np.ndarray dydt
    cdef public np.ndarray senpar

    cdef np.ndarray info
    cdef np.ndarray atol
    cdef np.ndarray rtol
    cdef np.ndarray rwork
    cdef np.ndarray iwork
    cdef np.ndarray rpar
    cdef np.ndarray ipar
    cdef int idid

    cpdef initialize(self, double t0, np.ndarray y0, np.ndarray dydt0=?, np.ndarray senpar=?, atol=?, rtol=?)

    cpdef advance(self, double tout)

    cpdef step(self, double tout)

    cdef solve(self, double tout)


#
# Cython version of Knuth's "man or boy" test -- "It separates the man
# Algol 60 compilers from the boy Algol 60 compilers." Here's the
# original (from wikipedia):
#
# begin
#   real procedure A (k, x1, x2, x3, x4, x5);
#   value k; integer k;
#   begin
#     real procedure B;
#     begin k:= k - 1;
#           B:= A := A (k, B, x1, x2, x3, x4);
#     end;
#     if k <= 0 then A:= x4 + x5 else B;
#   end;
#   outreal (A (10, 1, -1, -1, 1, 0));
# end;
#
# and a table of values:
#
#   k           A
#   0           1
#   1           0
#   2   	-2
#   3   	0
#   4   	1
#   5   	0
#   6   	1
#   7   	-1
#   8   	-10
#   9   	-30
#   10   	-67
#
# Past 10 or so, we blow the C stack -- can't just set a higher recursion limit
# to get around that one.
#

def compute(val):
    if isinstance(val, int):
        return val
    else:
        return val()

def a(in_k, x1, x2, x3, x4, x5):
    """
    >>> import sys
    >>> sys.setrecursionlimit(1350)
    >>> a(10, 1, -1, -1, 1, 0)
    -67
    """
    k = [in_k]
    def b():
        k[0] -= 1
        return a(k[0], b, x1, x2, x3, x4)
    return compute(x4) + compute(x5) if k[0] <= 0 else b()


#cython profile=True
"""
cython -a fast_linbin.pyx
gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -I/usr/local/lib/python2.7/dist-packages/numpy/core/include/ -o fast_linbin.so fast_linbin.c
"""

cimport cython
cimport numpy as np
import numpy as np

ctypedef np.float64_t DOUBLE
ctypedef np.int_t INT

@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
def linbin(np.ndarray[DOUBLE, ndim=1] X, double a, double b, int M,
           int trunc=1):
    """
    Linear Binning as described in Fan and Marron (1994)
    """
    cdef int i, li_i
    cdef int nobs = X.shape[0]
    cdef double delta = (b - a)/(M - 1)

    cdef np.ndarray[DOUBLE, ndim=1] gcnts = np.zeros(M, np.float)
    cdef np.ndarray[DOUBLE, ndim=1] lxi = (X - a)/delta
    cdef np.ndarray[INT, ndim=1] li = lxi.astype(int)
    cdef np.ndarray[DOUBLE, ndim=1] rem = lxi - li

    for i in range(nobs):
        li_i = li[i]
        if li_i > 1 and li_i < M:
            gcnts[li_i] = gcnts[li_i] + 1 - rem[i]
            gcnts[li_i+1] = gcnts[li_i+1] + rem[i]
        if li_i > M and trunc == 0:
            gcnts[M] = gcnts[M] + 1
    return gcnts


cdef void raise_py_error():
    pass

cdef extern from "foo.h":
    cdef int generic_error() except +
    cdef int specified_error() except +MemoryError
    cdef int dynamic_error() except +raise_py_error

def test_it():
    generic_error()
    specified_error()
    dynamic_error()


Add test for memoryview of extension type

# mode: run
# tag: numpy

import numpy as np

cdef class ExtensionType(object):
    cdef public int dummy

    def __init__(self, n):
        self.dummy = n

items = [ExtensionType(1), ExtensionType(2)]
cdef ExtensionType[:] view = np.array(items, dtype=ExtensionType)

def test_getitem():
    """
    >>> test_getitem()
    1
    2
    """
    for i in range(view.shape[0]):
        item = view[i]
        print item.dummy

def test_getitem_typed():
    """
    >>> test_getitem_typed()
    1
    2
    """
    cdef ExtensionType item
    for i in range(view.shape[0]):
        item = view[i]
        print item.dummy


<%= gettext("Internal Pages") %>

  <%= gettext("Here you can log in as a Jumu organizer.") %>

    <%= form_for @conn, session_path(@conn, :create), [as: :session], fn f -> %>

        <%= label f, :email, gettext("Email"), class: "control-label" %>
        <%= email_input f, :email, class: "form-control", autofocus: true %>

          <%= label f, :password, gettext("Password"), class: "control-label" %>

          <%= link gettext("Forgot password?"), to: password_reset_path(@conn, :new) %>

        <%= password_input f, :password, class: "form-control" %>

        <%= label f, :remember_me do %>
          <%= checkbox f, :remember_me %> <%= gettext("Stay logged in") %>
        <% end %>

      <%= submit gettext("Log in"), class: "btn btn-primary" %>
    <% end %>

Tweak login form width on smaller screens


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title><%= gettext("Jumu Nordost") %></title>

    <link href="https://fonts.googleapis.com/css?family=Lato:300,300i,400,400i,700,700i" rel="stylesheet">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

  <body>
    <div class="container">
      <header class="header">
        <%= render "nav.html", conn: @conn, current_user: @current_user %>
      </header>

      <%= if assigns[:breadcrumbs] do %>
        <%= render "breadcrumbs.html", conn: @conn, breadcrumbs: @breadcrumbs %>
      <% end %>

      <%= render "flash.html", conn: @conn %>

      <main role="main">
        <%= render @view_module, @view_template, assigns %>
      </main>
    </div>

    <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
    <%= render_existing @view_module, "scripts." <> @view_template, assigns %>
  </body>
</html>

Simplify HTML structure in app layout

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title><%= gettext("Jumu Nordost") %></title>

    <link href="https://fonts.googleapis.com/css?family=Lato:300,300i,400,400i,700,700i" rel="stylesheet">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

  <body>
    <header class="header">
      <%= render "nav.html", conn: @conn, current_user: @current_user %>
    </header>

    <main role="main" class="container">
      <%= if assigns[:breadcrumbs] do %>
        <%= render "breadcrumbs.html", conn: @conn, breadcrumbs: @breadcrumbs %>
      <% end %>

      <%= render "flash.html", conn: @conn %>

      <%= render @view_module, @view_template, assigns %>
    </main>

    <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
    <%= render_existing @view_module, "scripts." <> @view_template, assigns %>
  </body>
</html>


<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title><%= gettext("Elixir Jobs") %></title>
    <description><%= gettext "Find your next Elixir job." %></description>
    <link><%= offer_url(@conn, :index) %></link>
    <%= for offer <- @offers do %>
      <item>
        <title><![CDATA[<%= xml_strip_tags(offer.title) %>]]></title>
        <description><![CDATA[

              <%= gettext "Job place:" %> <%= HumanizeHelper.human_get_place(offer.job_place, gettext("Unknown")) %>

              <%= gettext "Job type:" %> <%= HumanizeHelper.human_get_type(offer.job_type, gettext("Unknown")) %>

              <%= gettext "Job location:" %> <%= xml_strip_tags(offer.location) %>

          <%= offer.summary %>
        ]]></description>
        <pubDate><%= xml_readable_date(offer.inserted_at) %></pubDate>
        <link><%= offer.url %></link>
        <guid><%= offer.url %></guid>
      </item>
    <% end %>
  </channel>
</rss>

Use our URLs on the XML

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title><%= gettext("Elixir Jobs") %></title>
    <description><%= gettext "Find your next Elixir job." %></description>
    <link><%= offer_url(@conn, :index) %></link>
    <%= for offer <- @offers do %>
      <item>
        <title><![CDATA[<%= xml_strip_tags(offer.title) %>]]></title>
        <description><![CDATA[

              <%= gettext "Job place:" %> <%= HumanizeHelper.human_get_place(offer.job_place, gettext("Unknown")) %>

              <%= gettext "Job type:" %> <%= HumanizeHelper.human_get_type(offer.job_type, gettext("Unknown")) %>

              <%= gettext "Job location:" %> <%= xml_strip_tags(offer.location) %>

          <%= offer.summary %>
        ]]></description>
        <pubDate><%= xml_readable_date(offer.inserted_at) %></pubDate>
        <link><%= offer_url(@conn, :show, offer.slug) %></link>
        <guid><%= offer_url(@conn, :show, offer.slug) %></guid>
      </item>
    <% end %>
  </channel>
</rss>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Phoenix!</title>
    <link rel="stylesheet" href="<%%= static_path(@conn, "/css/app.css") %>">

Get Started

      <%%= @inner %>

phoenixframework.org

Add flash info and error messages to layout

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Phoenix!</title>
    <link rel="stylesheet" href="<%%= static_path(@conn, "/css/app.css") %>">

Get Started

<%%= get_flash(@conn, :info) %>

<%%= get_flash(@conn, :error) %>

      <%%= @inner %>

phoenixframework.org


Landeswettbewerbe 2020

Der Landeswettbewerb des Verbunds 1 fand dieses Jahr in Valencia statt.

      Die Landeswettbewerbe in Warschau und Rom mussten wegen der derzeitigen COVID-19-Pandemie leider abgesagt werden.

Aktuelle Infos

Vorspielpläne und Ergebnisse findest du rund um den jeweiligen Wettbewerb in der Jumu-App:

      <%= app_link :ios %> <%= app_link :android %>

Update home page for 2021 LW season

Landeswettbewerbe 2021

Die Landeswettbewerbe finden dieses Jahr in San Sebastián, in Kopenhagen (digital) und in Rom (digital) statt.

Genauere Infos zum Hochladen der Vorspiele zu den digitalen Wettbewerben folgen in den nächsten Wochen.

Aktuelle Infos

Vorspielpläne und Ergebnisse findest du rund um den jeweiligen Wettbewerb in der Jumu-App:

      <%= app_link :ios %> <%= app_link :android %>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Phoenix!</title>
    <link rel="stylesheet" href="<%%= static_path(@conn, "/css/app.css") %>">

Get Started

<%%= get_flash(@conn, :info) %>

<%%= get_flash(@conn, :error) %>

      <%%= @inner %>

Update HTML layout to use sectioning elements


Literaturberatung

  So bekommst du Antworten auf deine Fragen zur Wettbewerbsliteratur.

        Welche Werke gibt es für eine bestimmte Besetzung?

        Gilt ein bestimmtes Stück als Duo, oder ist es ein Solostück mit Begleitung?

        Wo finde ich seltenere Werke jenseits der "Hitparade"?

Bei diesen und ähnlichen Fragen hilft dir die Bundesgeschäftsstelle des Deutschen Musikrats weiter. Hier findest du die <%= link "Kontaktdaten", to: "https://www.jugend-musiziert.org/bundesgeschaeftsstelle/kontakt/team.html" %> (Suchwort: "Literaturberatung").

Außerdem gibt es dort diverse <%= link "Literaturlisten", to: "https://www.jugend-musiziert.org/ausschreibung/literaturlisten.html" %> zum Bestellen oder Herunterladen.

Improve formatting of literature guidance page

Literaturberatung

  So bekommst du Antworten auf deine Fragen zur Wettbewerbsliteratur.

      Welche Werke gibt es für eine bestimmte Besetzung?

Gilt dieses Stück als Duo, oder ist es ein Solostück mit Begleitung?

Wo finde ich seltenere Werke jenseits der “Hitparade”?

Bei diesen und ähnlichen Fragen hilft dir die Bundesgeschäftsstelle des Deutschen Musikrats weiter. Hier findest du die <%= link "Kontaktdaten", to: "https://www.jugend-musiziert.org/bundesgeschaeftsstelle/kontakt/team.html" %> (Suchwort: "Literaturberatung").

Außerdem gibt es dort diverse <%= link "Literaturlisten", to: "https://www.jugend-musiziert.org/ausschreibung/literaturlisten.html" %> zum Bestellen oder Herunterladen.


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Link!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

        Instagram Link

      <% if get_flash(@conn, :info) do %>

<%= get_flash(@conn, :info) %>

      <% end %>
      <% if get_flash(@conn, :error) do %>

<%= get_flash(@conn, :error) %>

      <% end %>

      <%= @inner %>

Rename header bar to Hello Link!

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Link!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

        Hello Link!

      <% if get_flash(@conn, :info) do %>

<%= get_flash(@conn, :info) %>

      <% end %>
      <% if get_flash(@conn, :error) do %>

<%= get_flash(@conn, :error) %>

      <% end %>

      <%= @inner %>


<%= for %{name: name, avatar_url: image} <- @members do %>

  <% src_url = image || "volunteers/profile-placeholder.png" %>

      <img class="img-fluid" src="/images/<%= src_url %>" alt="<%= name %>">

    <%= name %>

  <% end %>

Use image_path/2 helper for working groups

<%= for %{name: name, avatar_url: image} <- @members do %>

  <% src_url = image || "volunteers/profile-placeholder.png" %>

      <img class="img-fluid" src="<%= img_path(@conn, src_url) %>" alt="<%= name %>">

    <%= name %>

  <% end %>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello GraphQL Elixir!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

Get Started

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= render @view_module, @view_template, assigns %>

Add site metadata and remove Phoenix header/logo

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="GraphQL Elixir examples and GraphiQL sandbox">
    <meta name="author" content="GraphQL Elixir team">

    <title>GraphQL Elixir - Phoenix examples</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= render @view_module, @view_template, assigns %>


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <title>RemoteRetro</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/semantic-ui/semantic.min.css") %>">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

  <body class="<%= if @view_module.include_backdrop, do: "photo-backdrop" %>">
    <main role="main">
      <%= render @view_module, @view_template, assigns %>
    </main>

    <%= if @view_module.include_js do %>
      <script>window.userToken = "<%= assigns[:user_token] %>"</script>
      <script>window.retroUUID = "<%= assigns[:retro_uuid] %>"</script>
      <script src="<%= static_path(@conn, "/js/dll/dll.vendor.js") %>"></script>
      <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
    <% end %>
  </body>
</html>

Use @ shorthand in views

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <title>RemoteRetro</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/semantic-ui/semantic.min.css") %>">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

  <body class="<%= if @view_module.include_backdrop, do: "photo-backdrop" %>">
    <main role="main">
      <%= render @view_module, @view_template, assigns %>
    </main>

    <%= if @view_module.include_js do %>
      <script>
        window.userToken = "<%= @user_token %>";
        window.retroUUID = "<%= @retro_uuid %>";
      </script>
      <script src="<%= static_path(@conn, "/js/dll/dll.vendor.js") %>"></script>
      <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
    <% end %>
  </body>
</html>


<%= render "_modal_keybinds.html" %>

<%= link "Finals View", to: skin_path(@conn, :show, @game), class: "btn btn-default btn-xs view-btn" %>

Remove button on board viewer


Listing games

<%= for game <- @games do %>

        <%= game.id %>

        <%= link "Show", to: game_path(@conn, :show, game), class: "btn btn-default btn-xs" %>
        <%= link "Edit", to: game_path(@conn, :edit, game), class: "btn btn-default btn-xs" %>
        <%= link "Delete", to: game_path(@conn, :delete, game), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

<% end %>

<%= link "New game", to: game_path(@conn, :new) %>

Index lists matching pids for running games.

Listing games

<%= for game <- @games do %>

        <%= game.id %>

        <%= inspect BattleSnake.GameServer.Registry.lookup to_string game.id %>

        <%= link "Show", to: game_path(@conn, :show, game), class: "btn btn-default btn-xs" %>
        <%= link "Edit", to: game_path(@conn, :edit, game), class: "btn btn-default btn-xs" %>
        <%= link "Delete", to: game_path(@conn, :delete, game), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

<% end %>

<%= link "New game", to: game_path(@conn, :new) %>


RemoteRetroBETA

Built by

    Connecting...

Add alt text to Stride logo

RemoteRetroBETA

Built by

    Connecting...


      Name
      Phone
      Email
      Bio

<%= for employee <- @employees do %>

      <img src="<%= employee.avatar_url %>" style="height: 90px; width: auto; border-radius: 50%;" />
      <%= employee.name %>
      <%= employee.phone %>
      <%= employee.email %>
      <%= employee.bio %>

        <%= link "Show", to: employee_path(@conn, :show, employee), class: "btn btn-default btn-xs" %>
        <%= link "Edit", to: employee_path(@conn, :edit, employee), class: "btn btn-default btn-xs" %>
        <%= link "Delete", to: employee_path(@conn, :delete, employee), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

<% end %>

<%= link "New employee", class: "btn btn-lg btn-outline", to: employee_path(@conn, :new) %>

Make 'New employee' button look nicer.

      Name
      Phone
      Email
      Bio

<%= for employee <- @employees do %>

      <img src="<%= employee.avatar_url %>" style="height: 90px; width: auto; border-radius: 50%;" />
      <%= employee.name %>
      <%= employee.phone %>
      <%= employee.email %>
      <%= employee.bio %>

        <%= link "Show", to: employee_path(@conn, :show, employee), class: "btn btn-default btn-xs" %>
        <%= link "Edit", to: employee_path(@conn, :edit, employee), class: "btn btn-default btn-xs" %>
        <%= link "Delete", to: employee_path(@conn, :delete, employee), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

<% end %>

<%= link "New employee", to: employee_path(@conn, :new), class: "btn btn-default" %>


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title><%= @name %> </title>
    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
    <link rel="stylesheet" href="/main.css">
  </head>
  <body>
  <%%= content %>
  <script type="text/javascript" src="/main.js"> </script>
  </body>
</html>

Add favicon to make static assets' presence more obvious

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title><%= @name %> </title>
    <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
    <link rel="stylesheet" href="/main.css">
    <link rel="icon" href="/favicon.ico">
  </head>
  <body>
  <%%= content %>
  <script type="text/javascript" src="/main.js"> </script>
  </body>
</html>


  <article id='<%= "post_#{@first.id}" %>' class='content post'>

<a href='<%= page_path(@conn, :show, @first.permalink) %>'><%= @first.title %>

    <%= "By #{author_name(@first.user)}" %>
    <%= human_date(@first.published_at) %>

<%= markdown_to_html(@first.body) %>

  <%= for post <- @posts do %>
    <article id='<%= "post_#{post.id}" %>' class='content post'>

<a href='<%= page_path(@conn, :show, post.permalink) %>'><%= post.title %>

      <%= "By #{author_name(post.user)}" %>
      <%= human_date(post.published_at) %>

<%= @first.summary %>

  <% end %>

Set correct summary for not first post

  <article id='<%= "post_#{@first.id}" %>' class='content post'>

<a href='<%= page_path(@conn, :show, @first.permalink) %>'><%= @first.title %>

    <%= "By #{author_name(@first.user)}" %>
    <%= human_date(@first.published_at) %>

<%= markdown_to_html(@first.body) %>

  <%= for post <- @posts do %>
    <article id='<%= "post_#{post.id}" %>' class='content post'>

<a href='<%= page_path(@conn, :show, post.permalink) %>'><%= post.title %>

      <%= "By #{author_name(post.user)}" %>
      <%= human_date(post.published_at) %>

<%= post.summary %>

  <% end %>


Tags

	 <%= Enum.map(@content, fn(tag) -> %>
		<a class="round tag-cloud" href="/tags/<%= Dnevnik.Utils.IO.url_slug(tag) %>.html"><%= tag %>
	 <% end) %>

Revert "Tag index template for poole theme updated to handle tag names with spaces"

Tags

	 <%= Enum.map(@content, fn(tag) -> %>
		<a class="round tag-cloud" href="/tags/<%= tag %>.html"><%= tag %>
	 <% end) %>


Listing companies

<%= link "New company", to: company_path(@conn, :new) %>

      Name
      Join date
      Members

<%= for company <- @companies do %>

        <%= link company.name, to: company_path(@conn, :show, company) %>
        <%= link "Edit", to: company_path(@conn, :edit, company), class: "btn btn-default btn-xs" %>
        <%= link "Deactivate", to: company_path(@conn, :delete, company), method: :delete, data: [confirm: "This will lock out all of this company's members. Are you sure?"], class: "btn btn-danger btn-xs" %>

      <%= company.join_date %>

          <%= for member <- company.members do %>

<%= link member.name, to: company_member_path(@conn, :show, company, member) %>

          <% end %>

<% end %>

<%= link "New company", to: company_path(@conn, :new) %>

Remove Edit/Deactivate buttons based on user feedback

Listing companies

<%= link "New company", to: company_path(@conn, :new) %>

      Name
      Join date
      Members

<%= for company <- @companies do %>

      <%= link company.name, to: company_path(@conn, :show, company) %>
      <%= company.join_date %>

          <%= for member <- company.members do %>

<%= link member.name, to: company_member_path(@conn, :show, company, member) %>

          <% end %>

<% end %>

<%= link "New company", to: company_path(@conn, :new) %>


Show teacher

     Full name:
    <%= @teacher.name %>

     Email:
    <%= @teacher.email %>

     Phone Number:
    <%= @teacher.phone_number %>

<%= link "Edit", to: teacher_path(@conn, :edit, @teacher) %>
<%= link "Back", to: teacher_path(@conn, :index) %>

Add status to teacher view.

Show teacher

     Full name:
    <%= @teacher.name %>

     Email:
    <%= @teacher.email %>

     Phone Number:
    <%= @teacher.phone_number %>

     Status:
    <%= @teacher.status %>

<%= link "Edit", to: teacher_path(@conn, :edit, @teacher) %>
<%= link "Back", to: teacher_path(@conn, :index) %>


Queue: <%= @queue %>

<%= if @running_jobs |> Enum.empty? do %>

No running jobs at the moment.

<% else %>

Running jobs

    Id
    Enqueued at
    Started at
    Class/Worker
    Arguments

  <%= for job <- jobs(@running_jobs) do %>

      <%= job.jid %>
      <%= job.enqueued_at %>
      <%= job.started_at %>
      <%= job.class %>
      <%= job.args %>

  <% end %>

<% end %>

Fix running jobs table style


<%= form_for @conn, retro_path(@conn, :create), [as: :retro, class: "ui form basic segment"], fn _f -> %>
  <%= submit "Create a Retrospective", class: "ui button teal" %>
<% end %>

Add intro copy to root

    Get Better With Your Team

Remote Retro lets you get together, even when you're far apart.

  <%= form_for @conn, retro_path(@conn, :create), [as: :retro, class: "ui form"], fn _f -> %>
    <%= submit "Create a Retrospective", class: "ui tiny button teal" %>
  <% end %>


<%= form_for @changeset, post_path(@conn, :create), fn f -> %>

      <%= label f, :title %>
      <%= error_tag f, :title %>

      <%= text_input f, :title, placeholder: "Enter title..." %>

      <%= label f, :body %>
      <%= error_tag f, :body %>

      <%= text_input f, :body, placeholder: "Enter body..." %>

      <%= label f, :channel_id, "Channel" %>
      <%= error_tag f, :channel_id %>

      <%= select f, :channel_id, @channels, prompt: "" %>

  <%= submit "Submit" %>
  <%= link("cancel", to: "/") %>
<% end %>

Convert text input to textarea

<%= form_for @changeset, post_path(@conn, :create), fn f -> %>

      <%= label f, :title %>
      <%= error_tag f, :title %>

      <%= text_input f, :title, placeholder: "Enter title..." %>

      <%= label f, :body %>
      <%= error_tag f, :body %>

      <%= textarea f, :body,
        placeholder: "Enter body...",
        class: "autosize",
        style: "overflow: hidden; word-wrap: break-word; height: 72px;"
      %>

      <%= label f, :channel_id, "Channel" %>
      <%= error_tag f, :channel_id %>

      <%= select f, :channel_id, @channels, prompt: "" %>

  <%= submit "Submit" %>
  <%= link("cancel", to: "/") %>
<% end %>


# This file excludes paths from the Docker build context.
#
# By default, Docker's build context includes all files (and folders) in the
# current directory. Even if a file isn't copied into the container it is still sent to
# the Docker daemon.
#
# There are multiple reasons to exclude files from the build context:
#
# 1. Prevent nested folders from being copied into the container (ex: exclude
#    /assets/node_modules when copying /assets)
# 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc)
# 3. Avoid sending files containing sensitive information
#
# More information on using .dockerignore is available here:
# https://docs.docker.com/engine/reference/builder/#dockerignore-file

.dockerignore

# Ignore git, but keep git HEAD and refs to access current commit hash if needed:
#
# $ git show HEAD --pretty=full | head -n 1
# commit d0b8727759e1e0e7aa3d41707d12376e373d5ecc
.git
!.git/HEAD
!.git/refs

# Common development/test artifacts
/cover/
/doc/
/test/
/tmp/
.elixir_ls

# Mix artifacts
/_build/
/deps/
*.ez

# Generated on crash by the VM
erl_crash.dump

# Static artifacts - These should be fetched and built inside the Docker image
/assets/node_modules/
/priv/static/assets/
/priv/static/cache_manifest.json

Use working git sha example

# This file excludes paths from the Docker build context.
#
# By default, Docker's build context includes all files (and folders) in the
# current directory. Even if a file isn't copied into the container it is still sent to
# the Docker daemon.
#
# There are multiple reasons to exclude files from the build context:
#
# 1. Prevent nested folders from being copied into the container (ex: exclude
#    /assets/node_modules when copying /assets)
# 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc)
# 3. Avoid sending files containing sensitive information
#
# More information on using .dockerignore is available here:
# https://docs.docker.com/engine/reference/builder/#dockerignore-file

.dockerignore

# Ignore git, but keep git HEAD and refs to access current commit hash if needed:
#
$ cat .git/HEAD | awk '{print ".git/"$2}' | xargs cat
# d0b8727759e1e0e7aa3d41707d12376e373d5ecc
.git
!.git/HEAD
!.git/refs

# Common development/test artifacts
/cover/
/doc/
/test/
/tmp/
.elixir_ls

# Mix artifacts
/_build/
/deps/
*.ez

# Generated on crash by the VM
erl_crash.dump

# Static artifacts - These should be fetched and built inside the Docker image
/assets/node_modules/
/priv/static/assets/
/priv/static/cache_manifest.json


<%= gettext("Contests") %>

        <%= gettext("Name") %>
        <%= gettext("Dates") %>
        <%= gettext("Deadline") %>

      <%= for contest <- @contests do %>

          <%= link name_with_flag(contest),
            to: internal_contest_path(@conn, :show, contest)
            %>

        <%= dates(contest) %>
        <%= format_date(contest.deadline) %>

          <%= icon_link("pencil", nil, internal_contest_path(@conn, :edit, contest),
            class: "btn btn-default btn-xs") %>

      <% end %>

Hide edit button in contest list from non-admins

<%= gettext("Contests") %>

        <%= gettext("Name") %>
        <%= gettext("Dates") %>
        <%= gettext("Deadline") %>

      <%= for contest <- @contests do %>

          <%= link name_with_flag(contest),
            to: internal_contest_path(@conn, :show, contest)
            %>

        <%= dates(contest) %>
        <%= format_date(contest.deadline) %>

          <%= if admin?(@current_user) do %>
            <%= icon_link("pencil", nil, internal_contest_path(@conn, :edit, contest),
              class: "btn btn-default btn-xs") %>
          <% end %>

      <% end %>


<%= @project.name %>

<%= for batch <- @batches do %>

<%= stringify_state(batch.state) %>

<%= for patch <- batch.patches do %>

<%= patch.commit %>

<% end %>

<% end %>

In review

<%= for patch <- @unbatched_patches do %>

<%= patch.commit %>

<% end %>

Hide "in review" when the list is empty

<%= @project.name %>

<%= for batch <- @batches do %>

<%= stringify_state(batch.state) %>

<%= for patch <- batch.patches do %>

<%= patch.commit %>

<% end %>

<% end %>
<%= if @unbatched_patches != [] do %>

In review

<%= for patch <- @unbatched_patches do %>

<%= patch.commit %>

<% end %>

<% end %>


Frequently Asked Questions

Add frequently asked questions in markup

Frequently Asked Questions

Looks cool, but... what's a retro?

'Retro' is short for retrospective. A retrospective is one of the core Agile ceremonies. Retrospectives are used by teams to reflect on the events of their past iteration, with the aim of identifying where they can improve and generating action items that will help them make those improvements.

Who can use RemoteRetro?

Anyone with a Google account of any kind can enter a retrospective!

My team is entirely colocated. Should we use RemoteRetro?

You certainly could, but we don't recommend it, as there's no substitute for face-to-face communication. Use a whiteboard!

Why is RemoteRetro open source?

The entire software development community stands on the shoulders of giants, and Stride is no exception. We talked it over and were unanimous in our desire to give back to the open source community.

Where can I learn about planned features and updates?

Our backlog resides in GitHub issues, which can be viewed in priority order via the wonderful ZenHub Chrome extension.

How many people should participate in a retro?

Ideally, a retrospective will contain no more than 10 people. Exceed 10, and participants will check out because they feel they can go unnoticed. If you can, keep the numbers low!

How can I submit feedback on my experience?

Users are presented with a survey at the close of their first retro. Additionally, bugs and feature requests can be filed via GitHub issues at https://github.com/stride-nyc/remote_retro/issues/new or via email at remote_retro@stridenyc.com


Listing <%= plural %>

<%= for {k, _} <- attrs do %>    <%= Phoenix.Naming.camelize(k) %>
<% end %>

<%= "<%=" %> for <%= singular %> <- @<%= plural %> do <%= "%\>" %>

<%= for {k, _} <- attrs do %>    <%= "<%=" %> <%= singular %>.<%= k %> <%= "%\>" %>
<% end %>
    <%= "<%=" %> link "Show", to: <%= singular %>_path(@conn, :show, <%= singular %>) <%= "%\>" %>
    <%= "<%=" %> link "Edit", to: <%= singular %>_path(@conn, :edit, <%= singular %>) <%= "%\>" %>
    <%= "<%=" %> link "Delete", to: <%= singular %>_path(@conn, :delete, <%= singular %>), method: :delete <%= "%\>" %>

<%% end %>

<%= "<%=" %> link "New <%= singular %>", to: <%= singular %>_path(@conn, :new) <%= "%\>" %>

Improve generated index template styling

Listing <%= plural %>

<%= for {k, _} <- attrs do %>      <%= Phoenix.Naming.camelize(k) %>
<% end %>

<%= "<%=" %> for <%= singular %> <- @<%= plural %> do <%= "%\>" %>

<%= for {k, _} <- attrs do %>      <%= "<%=" %> <%= singular %>.<%= k %> <%= "%\>" %>
<% end %>

        <%= "<%=" %> link "Show", to: <%= singular %>_path(@conn, :show, <%= singular %>), class: "btn btn-default btn-xs" <%= "%\>" %>
        <%= "<%=" %> link "Edit", to: <%= singular %>_path(@conn, :edit, <%= singular %>), class: "btn btn-default btn-xs" <%= "%\>" %>
        <%= "<%=" %> link "Delete", to: <%= singular %>_path(@conn, :delete, <%= singular %>), method: :delete, class: "btn btn-danger btn-xs" <%= "%\>" %>

<%% end %>

<%= "<%=" %> link "New <%= singular %>", to: <%= singular %>_path(@conn, :new), class: "btn btn-primary" <%= "%\>" %>


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Webapp!</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

  <body class="<%= view_action @conn %>">
    <%= render @view_module, @view_template, assigns %>
    <script src="<%= static_path(@conn, "/js/commons.chunk.js") %>"></script>
    <script src="<%= static_path(@conn, "/js/vendor.bundle.js") %>"></script>
    <script src="<%= static_path(@conn, "/js/app.bundle.js") %>"></script>
  </body>
</html>

Add margin: 0 to body because of weird margin 8 added after importing _layout.scss from MDL

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Webapp!</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

  <body style="margin: 0">
    <%= render @view_module, @view_template, assigns %>

    <%= if Mix.env == :test do %>
      <script src="<%= static_path(@conn, "/js/polyfill.js") %>"></script>
    <% end %>
    <script type="text/javascript"><%= server_js_vars %></script>
    <script src="<%= static_path(@conn, "/js/vendor.js") %>"></script>
    <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
  </body>
</html>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello MicrocrawlerWebapp!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

Get Started

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

        <%= render @view_module, @view_template, assigns %>

Add single page application stuff


Listing Users

      Email
      Name
      Role
      Family members

    <%= for user <- @users do %>

          <%= user.email %>
          <a href='<%= food_selection_path(@conn, :index, "en", login: login_token(user) ) %>'> <%= user.name %>, id: <%= user.id %>
          <%= user.role %>
          <%= user.family_members %>

            <%= link "Show", to: user_path(@conn, :show, user), class: "btn btn-default btn-xs" %>
            <%= link "Edit", to: user_path(@conn, :edit, user), class: "btn btn-default btn-xs" %>
            <%= link "Delete", to: user_path(@conn, :delete, user), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

    <% end %>

<%= link "New User", to: user_path(@conn, :new) %>

Fix an error on the user management page.

Listing Users

      Email
      Name
      Role
      Family members

    <%= for user <- @users do %>

          <%= user.email %>
          <a href='<%= food_selection_path(@conn, :index, login: login_token(user) ) %>'> <%= user.name %>, id: <%= user.id %>
          <%= user.role %>
          <%= user.family_members %>

            <%= link "Show", to: user_path(@conn, :show, user), class: "btn btn-default btn-xs" %>
            <%= link "Edit", to: user_path(@conn, :edit, user), class: "btn btn-default btn-xs" %>
            <%= link "Delete", to: user_path(@conn, :delete, user), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

    <% end %>

<%= link "New User", to: user_path(@conn, :new) %>


    <%= link("Zones", to: Routes.admin_zone_path(@conn, :index), class: "text-blue-700") %> »
    <%= link(@zone.name, to: Routes.admin_zone_path(@conn, :show, @zone.id), class: "text-blue-700") %> »
    Editing

Edit

    <%= render("_form.html", changeset: @changeset, url: Routes.admin_zone_path(@conn, :edit, @zone.id), submit: "Update") %>

Update route for updating zones

    <%= link("Zones", to: Routes.admin_zone_path(@conn, :index), class: "text-blue-700") %> »
    <%= link(@zone.name, to: Routes.admin_zone_path(@conn, :show, @zone.id), class: "text-blue-700") %> »
    Editing

Edit

    <%= render("_form.html", changeset: @changeset, url: Routes.admin_zone_path(@conn, :update, @zone.id), submit: "Update") %>


<!DOCTYPE html>

<meta charset="utf-8">
<title>Index of <%= Plug.HTML.html_escape(basepath) %></title>

<base href="<%= Plug.HTML.html_escape(basepath) %>">

Index of <%= Plug.HTML.html_escape(basepath) %>

Parent Directory

Add base path to parent directory link

<!DOCTYPE html>

<meta charset="utf-8">
<title>Index of <%= Plug.HTML.html_escape(basepath) %></title>

<base href="<%= Plug.HTML.html_escape(basepath) %>">

Index of <%= Plug.HTML.html_escape(basepath) %>

<a href="<%= Plug.HTML.html_escape(basepath) %>/..">Parent Directory


<!DOCTYPE html>

    <meta http-equiv="refresh" content="5" >
    <title>UnsocialVR participants scores</title>

                Player ID
                Participant ID
                Score

        <%= for {player_id, %{participant_id: participant_id, score: score}} <- scores do %>

                <%= player_id %>
                <%= participant_id %>
                <%= score %>

        <%= end %>

    <form action="reset" method="POST">
        <button type="submit">Reset scores</button>
    </form>

Fix reset scores HTML form

<!DOCTYPE html>

    <meta http-equiv="refresh" content="5" >
    <title>UnsocialVR participants scores</title>

                Player ID
                Participant ID
                Score

        <%= for {player_id, %{participant_id: participant_id, score: score}} <- scores do %>

                <%= player_id %>
                <%= participant_id %>
                <%= score %>

        <%= end %>

    <form action="/scores/reset" method="POST">
        <button type="submit">Reset scores</button>
    </form>


#!/bin/sh
set -e

SCRIPT_DIR="$(cd $(dirname "$0") && pwd -P)"
RELEASE_ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
RELEASES_DIR="$RELEASE_ROOT_DIR/releases"
REL_NAME="<%= rel_name %>"
REL_VSN=$(cat $RELEASES_DIR/start_erl.data | cut -d' ' -f2)
ERTS_VSN=$(cat $RELEASES_DIR/start_erl.data | cut -d' ' -f1)

_cleanup() {
    echo "Shutting down node cleanly.."
    exec "$RELEASES_DIR/$REL_VSN/$REL_NAME.sh" rpc init stop
}

case "$1" in
    foreground)
        trap '_cleanup' HUP INT TERM QUIT

        "$RELEASES_DIR/$REL_VSN/$REL_NAME.sh" $@ &
        __pid=$!

        wait $__pid
        __exit_status=$?

        exit $__exit_status
        ;;
    *)
        exec "$RELEASES_DIR/$REL_VSN/$REL_NAME.sh" "$@"
        ;;
esac

Fix issue with spaces in paths when pulling release info from start_erl.data

#!/bin/sh
set -e

SCRIPT_DIR="$(cd $(dirname "$0") && pwd -P)"
RELEASE_ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
RELEASES_DIR="$RELEASE_ROOT_DIR/releases"
REL_NAME="<%= rel_name %>"
REL_VSN=$(cat "$RELEASES_DIR"/start_erl.data | cut -d' ' -f2)
ERTS_VSN=$(cat "$RELEASES_DIR"/start_erl.data | cut -d' ' -f1)

_cleanup() {
    echo "Shutting down node cleanly.."
    exec "$RELEASES_DIR/$REL_VSN/$REL_NAME.sh" rpc init stop
}

case "$1" in
    foreground)
        trap '_cleanup' HUP INT TERM QUIT

        "$RELEASES_DIR/$REL_VSN/$REL_NAME.sh" $@ &
        __pid=$!

        wait $__pid
        __exit_status=$?

        exit $__exit_status
        ;;
    *)
        exec "$RELEASES_DIR/$REL_VSN/$REL_NAME.sh" "$@"
        ;;
esac


Welcome to Phoenix!

A productive web framework that does not compromise speed and maintainability.

Resources

        Guides

        Docs

        Source

Help

        Mailing list

        Issues

        #elixir-lang on freenode IRC

        @elixirphoenix

Insert line break in subheader


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="stylesheet" href="<%= Routes.static_path(RemoteRetroWeb.Endpoint, "/css/semantic-ui/semantic.min.css") %>">

    <title>RemoteRetro</title>

        404

<%= assigns[:message] || "Page not found" %>

Add confused image to 404 page

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="stylesheet" href="<%= Routes.static_path(RemoteRetroWeb.Endpoint, "/css/semantic-ui/semantic.min.css") %>">

    <title>RemoteRetro</title>

      <img src="<%= Routes.static_path(RemoteRetroWeb.Endpoint, "/images/confused.svg") %>" alt="confused face" height="40" width="40" style="display: block; margin: 0.25rem auto;">

        404

<%= assigns[:message] || "Page not found" %>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Überauth Example</title>
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

              View on GitHub

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= render @view_module, @view_template, assigns %>

Fix the browser tab title.

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Phoenix Poker</title>
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

              View on GitHub

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= render @view_module, @view_template, assigns %>


Show team

    Token:
    <%= @team.slack_token %>

    Name:
    <%= @team.name %>

    Url:
    <%= @team.url %>

    Slack:
    <%= @team.slack_id %>

<%= link "Edit", to: team_path(@conn, :edit, @team) %>
<%= link "Back", to: team_path(@conn, :index) %>

Remove slack token from team show tempalte

Show team

    Name:
    <%= @team.name %>

    Url:
    <%= @team.url %>

    Slack:
    <%= @team.slack_id %>

<%= link "Edit", to: team_path(@conn, :edit, @team) %>
<%= link "Back", to: team_path(@conn, :index) %>


<!DOCTYPE html>

<meta charset="utf-8">
<title>Index of <%= Plug.HTML.html_escape(basepath) %></title>

Index of <%= Plug.HTML.html_escape(basepath) %>

Add parent directory link to template

<!DOCTYPE html>

<meta charset="utf-8">
<title>Index of <%= Plug.HTML.html_escape(basepath) %></title>

Index of <%= Plug.HTML.html_escape(basepath) %>

Parent Directory


Landeswettbewerbe 2020

      Die Landeswettbewerbe finden dieses Jahr in Valencia, Warschau und Rom statt.

Aktuelle Infos

Vorspielpläne und Ergebnisse findest du rund um den jeweiligen Wettbewerb in der Jumu-App:

      <%= app_link :ios %> <%= app_link :android %>

Update LW info with COVID-19 cancellation notice

Landeswettbewerbe 2020

Der Landeswettbewerb des Verbunds 1 fand dieses Jahr in Valencia statt.

      Der Landeswettbewerb in Warschau musste wegen der derzeitigen COVID-19-Pandemie leider abgesagt werden.

Aktuelle Infos

Vorspielpläne und Ergebnisse findest du rund um den jeweiligen Wettbewerb in der Jumu-App:

      <%= app_link :ios %> <%= app_link :android %>


<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

    <%= label f, :name, class: "control-label" %>
    <%= text_input f, :name, class: "form-control" %>
    <%= error_tag f, :name %>

    <%= label f, :url, class: "control-label" %>
    <%= text_input f, :url, class: "form-control" %>
    <%= error_tag f, :url %>

    <%= label f, :plugins, class: "control-label" %>
    <%= text_input f, :plugins, class: "form-control" %>
    <%= error_tag f, :plugins %>

    <%= label f, :delay, class: "control-label" %>
    <%= text_input f, :delay, class: "form-control" %>
    <%= error_tag f, :delay %>

    <%= label f, :enabled, class: "control-label" %>
    <%= checkbox f, :enabled, class: "form-control" %>
    <%= error_tag f, :enabled %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>

Use the new form_group function with error indicators

<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

  <%= form_group f, :name %>
    <%= label f, :name, class: "control-label" %>
    <%= text_input f, :name, class: "form-control" %>
    <%= error_tag f, :name %>

  <%= form_group f, :url %>
    <%= label f, :url, class: "control-label" %>
    <%= text_input f, :url, class: "form-control" %>
    <%= error_tag f, :url %>

  <%= form_group f, :plugins %>
    <%= label f, :plugins, class: "control-label" %>
    <%= text_input f, :plugins, class: "form-control" %>
    <%= error_tag f, :plugins %>

  <%= form_group f, :delay %>
    <%= label f, :delay, class: "control-label" %>
    <%= text_input f, :delay, class: "form-control" %>
    <%= error_tag f, :delay %>

  <%= form_group f, :enabled %>
    <%= label f, :enabled, class: "control-label" %>
    <%= checkbox f, :enabled, class: "form-control" %>
    <%= error_tag f, :enabled %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>


<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

    <%= label f, :email, class: "control-label" %>
    <%= text_input f, :email, class: "form-control" %>
    <%= error_tag f, :email %>

    <%= label f, :name, class: "control-label" %>
    <%= text_input f, :name, class: "form-control" %>
    <%= error_tag f, :name %>

    <%= label f, :password_hash, class: "control-label" %>
    <%= text_input f, :password_hash, class: "form-control" %>
    <%= error_tag f, :password_hash %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>

Switch password to password field on template

<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

    <%= label f, :email, class: "control-label" %>
    <%= text_input f, :email, class: "form-control" %>
    <%= error_tag f, :email %>

    <%= label f, :name, class: "control-label" %>
    <%= text_input f, :name, class: "form-control" %>
    <%= error_tag f, :name %>

    <%= label f, :password_hash, class: "control-label" %>
    <%= password_input f, :password_hash, class: "form-control" %>
    <%= error_tag f, :password_hash %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>


<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf"
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            unique-identifier="bookid" version="2.0">
  <metadata>
    <dc:title>Hello World: My First EPUB</dc:title>
    <dc:creator>My Name</dc:creator>
    <dc:identifier
id="bookid">urn:uuid:0cc33cbd-94e2-49c1-909a-72ae16bc2658</dc:identifier>
    <dc:language>en-US</dc:language>
    <meta name="cover" content="cover-image" />
  </metadata>
  <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="cover" href="title.html" media-type="application/xhtml+xml"/>
    <item id="content" href="module.html"
media-type="application/xhtml+xml"/>
    <item id="cover-image" href="images/cover.png" media-type="image/png"/>
    <item id="css" href="stylesheet.css" media-type="text/css"/>
  </manifest>
  <spine toc="ncx">
    <itemref idref="cover" linear="no"/>
    <itemref idref="content"/>
  </spine>
  <guide>
    <reference href="title.html" type="cover" title="Cover"/>
  </guide>
</package>

Add parameters for content template

<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         unique-identifier="<%= config.project %>" version="3.0">
  <metadata>
    <dc:title><%= config.project %> - <%= config.version %></dc:title>
    <dc:identifier id="<%= config.project %>">urn:uuid:0cc33cbd-94e2-49c1-909a-72ae16bc2658</dc:identifier>
    <dc:language>en-US</dc:language>
  </metadata>
  <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" properties="nav"/>
    <item id="nav" href="nav.html" media-type="application/xhtml+xml"/>
    <item id="cover" href="title.html" media-type="application/xhtml+xml"/>
    <%= for node <- all do %>
      <item id="<%= node.id %>" href="modules/<%= node.id %>.html" media-type="application/xhtml+xml"/>
    <% end %>
    <item id="css" href="stylesheet.css" media-type="text/css"/>
  </manifest>
  <spine toc="ncx">
    <itemref idref="cover" linear="no"/>
    <%= for node <- all do %>
      <itemref idref="<%= node.id %>"/>
    <% end %>
  </spine>
</package>


<%= if Enum.empty?(@queue_stats) do %>

No job was started yet.

<% else %>

Running queues stats

        Queue
        # Running
        # Enqueued
        # Finished
        # Failed

      <%= for queue <- stats(@queue_stats) do %>

          <%= link queue.queue, to: queues_path(@conn, :show, queue.queue) %>
          <%= link queue.running_counter |> to_string , to: queues_path(@conn, :busy, queue.queue) %>
          <%= link queue.enqueued_counter |> to_string, to: queues_path(@conn, :show, queue.queue) %>
          <%= queue.finished_counter %>
          <%= queue.failed_counter %>

      <% end %>

<% end %>

Rename Finished to Processed on running queue stats

<%= if Enum.empty?(@queue_stats) do %>

No job was started yet.

<% else %>

Running queues stats

        Queue
        # Running
        # Enqueued
        # Processed
        # Failed

      <%= for queue <- stats(@queue_stats) do %>

          <%= link queue.queue, to: queues_path(@conn, :show, queue.queue) %>
          <%= link queue.running_counter |> to_string , to: queues_path(@conn, :busy, queue.queue) %>
          <%= link queue.enqueued_counter |> to_string, to: queues_path(@conn, :show, queue.queue) %>
          <%= queue.finished_counter %>
          <%= queue.failed_counter %>

      <% end %>

<% end %>


Embed script

  Science is the key to our future, and if you don't believe in science, then you're holding everybody back. -- Bill Nye

<%= embed_script @asciicast %>

SVG

  If the Earth gets hit by an asteroid, it's game over. It's control-alt-delete
  for civilization. -- Bill Nye

<img src="<%= asciicast_path(@conn, :show, @asciicast) %>.svg" />

Embed script for home asciicast

<%= embed_script @home_asciicast %>

  You're dressed in a tuxedo, you wear a bow tie. A bow tie with a tuxedo is more formal than a straight tie with a tuxedo. -- Bill Nye

Add max-width for SVG on example page

Embed script

  Science is the key to our future, and if you don't believe in science, then you're holding everybody back. -- Bill Nye

<%= embed_script @asciicast %>

SVG

  If the Earth gets hit by an asteroid, it's game over. It's control-alt-delete
  for civilization. -- Bill Nye

<img src="<%= asciicast_path(@conn, :show, @asciicast) %>.svg" style="max-width: 100%" />

Embed script for home asciicast

<%= embed_script @home_asciicast %>

  You're dressed in a tuxedo, you wear a bow tie. A bow tie with a tuxedo is more formal than a straight tie with a tuxedo. -- Bill Nye


<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below:

        <%= for {attr, message} <- f.errors do %>

<%= humanize(attr) %> <%= message %>

        <% end %>

  <% end %>

    <%= label f, :name, "Partner1", class: "control-label" %>
    <%= text_input f, :partner1_id, class: "form-control" %>

    <%= label f, :name, "Partner2", class: "control-label" %>
    <%= text_input f, :partner2_id, class: "form-control" %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>

Change form labels to allow entry of the ids

<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below:

        <%= for {attr, message} <- f.errors do %>

<%= humanize(attr) %> <%= message %>

        <% end %>

  <% end %>

    <%= label f, :name, "Partner1 ID", class: "control-label" %>
    <%= text_input f, :partner1_id, class: "form-control" %>

    <%= label f, :name, "Partner2 ID", class: "control-label" %>
    <%= text_input f, :partner2_id, class: "form-control" %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>


<%= for appearance <- @appearances do %>
  <%= if @style == :detail do %>
    <%= full_name(appearance.participant) %>
  <% else %>
    <%= full_name(appearance.participant) %>
  <% end %>
  ,
  <%= instrument_name(appearance.instrument) %>
  <%= age_group_badge(appearance) %>

<% end %>

Fix comma in internal appearance partial template

<%= for appearance <- @appearances do %>
  <%= if @style == :detail do %>
    <%= full_name(appearance.participant) %>,
  <% else %>
    <%= full_name(appearance.participant) %>,
  <% end %>
  <%= instrument_name(appearance.instrument) %>
  <%= age_group_badge(appearance) %>

<% end %>


    Get Better With Your Team

Remote Retro lets you get together, even when you're far apart.

  <%= form_for @conn, retro_path(@conn, :create), [as: :retro, class: "ui form"], fn _f -> %>
    <%= submit "Create a Retrospective", class: "ui tiny button teal" %>
  <% end %>

Remove tiny ui class from create retro button

    Get Better With Your Team

Remote Retro lets you get together, even when you're far apart.

  <%= form_for @conn, retro_path(@conn, :create), [as: :retro, class: "ui form"], fn _f -> %>
    <%= submit "Create a Retrospective", class: "ui button teal" %>
  <% end %>


<tr id="pr-<%= @pr.number %>">

    <img src="<%= @pr.github_user_avatar %>" class="img-circle user-avatar" />

    <%= @pr.github_user %>

    <%= @pr.repo %>

    <%= @pr.branch %>

    <%= link @pr.title, to: @pr.html_url, target: "_blank" %>

    <%= link_if @pr.build_url, to: @pr.build_url, class: "label label-#{status_class(@pr.build_status)} text-uppercase", target: "_blank" do %>
      <%= to_string(@pr.build_status) %>
    <% end %>

    <%= if @pr.analysis_url do %>
      <%= link to: @pr.analysis_url, target: "_blank" do %>

      <% end %>
    <% end %>

    <%= if @pr.backoff > Application.get_env(:slack_coder, :pr_backoff_start, 1) do %>
      Stale for <%= staleness(@pr) %>
    <% end %>

Mark PRs which dont have build status info.

<tr id="pr-<%= @pr.number %>">

    <img src="<%= @pr.github_user_avatar %>" class="img-circle user-avatar" />

    <%= @pr.github_user %>

    <%= @pr.repo %>

    <%= @pr.branch %>

    <%= link @pr.title, to: @pr.html_url, target: "_blank" %>

    <%= link_if @pr.build_url, to: @pr.build_url, class: "label label-#{status_class(@pr.build_status)} text-uppercase", target: "_blank" do %>
      <%= to_string(@pr.build_status || "Unknown") %>
    <% end %>

    <%= if @pr.analysis_url do %>
      <%= link to: @pr.analysis_url, target: "_blank" do %>

      <% end %>
    <% end %>

    <%= if @pr.backoff > Application.get_env(:slack_coder, :pr_backoff_start, 1) do %>
      Stale for <%= staleness(@pr) %>
    <% end %>


    <%= @attendee_result.player.nickname %>

    <%= @attendee_result.chips %>

    <%= @attendee_result.exact_cents %>

    <%= @attendee_result.rounded_cents %>

Make player nickname into a button.


<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
  <rootfiles>
    <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/>
  </rootfiles>
</container>

Add encoding to container template

<?xml version="1.0" encoding="utf-8"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
  <rootfiles>
    <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/>
  </rootfiles>
</container>


<%= render("_offer.html", conn: @conn, offer: @offer, title_link: false) %>
<div class="offer-link">
  <%= link(gettext("Go to the offer!"), to: @offer.url, class: "btn btn-info", target: "_blank") %>
</div>

Add buttons on offer show

<%= render("_offer.html", conn: @conn, offer: @offer, title_link: false) %>
<div class="offer-link">
  <%= link(gettext("Go to the offer!"), to: @offer.url, class: "btn-info", target: "_blank") %>
  <%= if user_logged_in?(@conn) do %>
    <%= link(gettext("Edit offer"),
      to: admin_offer_path(@conn, :edit, @offer.slug),
      class: "btn-success") %>
    <%= if @offer.published_at do %>
      <%= link(gettext("Unpublish offer"),
        to: admin_offer_path(@conn, :unpublish, @offer.slug),
        class: "btn-primary") %>
    <% else %>
      <%= link(gettext("Publish offer"),
        to: admin_offer_path(@conn, :publish, @offer.slug),
        class: "btn-primary") %>
    <% end %>
    <%= link(gettext("Delete offer"),
      to: admin_offer_path(@conn, :delete, @offer.slug),
      class: "btn-danger",
      method: :delete,
      data: [confirm: gettext("Do you really want to delete this offer?")]) %>
  <% end %>
</div>


  <%= name(@contest) %>

  <%= dates(@contest) %>

<%= gettext("Preparation") %>

          <%= icon_link "music", gettext("Show performances"),
            internal_contest_performance_path(@conn, :index, @contest)
            %>

          <%= icon_link "user", gettext("Show participants"),
            internal_contest_participant_path(@conn, :index, @contest)
            %>

          <%= icon_link "list-alt", gettext("Show categories"),
          internal_contest_contest_category_path(@conn, :index, @contest)
          %>

Improve responsiveness of action panel on contest detail page


Looking for help? Elixir is quickly gaining momentum for web applications that
need concurrency, performance, and the ability to connect to many different
clients. The developers at
Hashrocket
are learning along with the rest of the development community that Elixir and
Phoenix are viable Rails alternatives for the right application.
Contact us
if you need help with your Elixir project.

Add a link to our source on Elixir TILs

Looking for help? Elixir is quickly gaining momentum for web applications that
need concurrency, performance, and the ability to connect to many different
clients. The developers at
Hashrocket
are learning along with the rest of the development community that Elixir and
Phoenix are viable Rails alternatives for the right application.
Check out the
source code
for Today I Learned, written in Elixir, and
contact us
if you need help with your Elixir project.


    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Configure your Farmbot account </title>
    <link rel="stylesheet" href="/styles.css">

Configure your FarmBot

FarmBot Web App Account

        <form method=post action=configure_credentials>
          <fieldset>

            Email

<input value="<%= email %>" type=email name=email value=>

            Password

            <%= if first_boot do %>
              <input value="<%= password %>" type="password" name=password>

            <% else %>
              <input value="Already Configured" type="text">

              <input value="<%= password %>" type="hidden" name=password>

            <% end %>

             Server

<input value="<%= server %>" type=text name=server>

          </fieldset>

      <input type=submit value="Finish">

    </form>

Add password show/hide toggle for API password

    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Configure your Farmbot account </title>
    <link rel="stylesheet" href="/styles.css">

Configure your FarmBot

FarmBot Web App Account

        <form method=post action=configure_credentials>
          <fieldset>
            Email
            <input value="<%= email %>" type="email" name="email" value=>

            Password

              <input value="<%= password %>" type="password" name="password" id="password">

             Server
            <input value="<%= server %>" type=text name=server>

          </fieldset>

      <input type=submit value="Finish">

    </form>


<a class="version-note" href="javascript:toggleSystemDataInfo();">
  Elixir <%= system.elixir%>, Erlang <%= system.erlang %>
</a>

Revert to use standard classes


Available skills

    <%= button "Create a new skill", to: skill_path(@conn, :new), method: :get %>
    <%= button "Create a new category", to: skill_category_path(@conn, :new), method: :get %>

    <%= for {category, skills} <-
          Enum.group_by(@skills, fn skill -> skill.category end) do %>

        <%= render "category_header.html", conn: @conn, category: category %>

          <%= for skill <- skills do %>

              <%= skill.name %>
              <%= skill.description %>

                <%= link "✎",
                      to: skill_path(@conn, :edit, skill.id),
                      class: "tooltip",
                      data: [tooltip: "Edit skill"]
                %>

                <%= link "✗",
                      to: skill_path(@conn, :delete, skill.id), method: :delete,
                      class: "tooltip",
                      data: [tooltip: "Delete skill",
                       confirm: "Are you sure you want to delete the #{skill.name} skill?"]
                %>

          <% end %>

    <% end %>

Add a "Edit my skills" button to skill edit page

Available skills

    <%= button "Edit my skills", to: skill_level_path(@conn, :edit), method: :get %>
    <%= button "Create a new skill", to: skill_path(@conn, :new), method: :get %>
    <%= button "Create a new category", to: skill_category_path(@conn, :new), method: :get %>

    <%= for {category, skills} <-
          Enum.group_by(@skills, fn skill -> skill.category end) do %>

        <%= render "category_header.html", conn: @conn, category: category %>

          <%= for skill <- skills do %>

              <%= skill.name %>
              <%= skill.description %>

                <%= link "✎",
                      to: skill_path(@conn, :edit, skill.id),
                      class: "tooltip",
                      data: [tooltip: "Edit skill"]
                %>

                <%= link "✗",
                      to: skill_path(@conn, :delete, skill.id), method: :delete,
                      class: "tooltip",
                      data: [tooltip: "Delete skill",
                       confirm: "Are you sure you want to delete the #{skill.name} skill?"]
                %>

          <% end %>

    <% end %>


<%= title() %>

  <%= gettext("The website for “Jugend musiziert” at German schools abroad") %>

    <%= host_map_image() %>

Add example panels to home page

<%= title() %>

  <%= gettext("The website for “Jugend musiziert” at German schools abroad") %>

    <%= host_map_image() %>

Beispiel eins

        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Beispiel zwei

         Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.


<img src='<%= static_path(@conn, "/images/readerl-icon-text.png") %>' alt='ReadErl' width='455' height='95'/>™

An RSS feed aggregator written in Elixir/Phoenix

I'm working on it: github.com/billstclair/readerl

  <%= :erlang.system_info(:system_version) %>

  Elixir: <%= System.version %>, Phoenix: <%= {:ok, vsn} = :application.get_key(:phoenix, :vsn); vsn %>

Make logo fit on iPhone browser.

<img src='<%= static_path(@conn, "/images/readerl-icon-text.png") %>' alt='ReadErl' width='227' height='48'/>™

An RSS feed aggregator written in Elixir/Phoenix

I'm working on it: github.com/billstclair/readerl

  <%= :erlang.system_info(:system_version) %>

  Elixir: <%= System.version %>, Phoenix: <%= {:ok, vsn} = :application.get_key(:phoenix, :vsn); vsn %>


Pages

<%= for page <- @pages do %>

<%= link page.title, to: page.title %> - <%= link "[Edit]", to: page.title<>"/edit" %>

<% end %>

Make Link to Edit Page dynamical

Pages

<%= for page <- @pages do %>

    <%= link page.title, to: page.title %> - <%= link "[Edit]", to: page_path(@conn, :edit, page.title) %>

<% end %>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Personal Twitter Bot</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

Get Started

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= @inner %>

Add version to layout footer

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Personal Twitter Bot</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

Get Started

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= @inner %>

    Version <%= :application.get_key(:personal_twitter_bot, :vsn) |> elem(1) %>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Phoenix!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

Homepage

Users

Campaigns

Encounters

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= @inner %>

Add characters link to homepage, reduce logo size

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello Phoenix!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

Homepage

Users

Characters

Campaigns

Encounters

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= @inner %>


<%= for list <- Enum.chunk_every(@members, 4) do %>

  <%= for %{name: name, image: image} <- list do %>

      <img class="img-fluid" src="/images/<%= image %>" alt="<%= name %>">

    <%= name %>

  <% end %>

<% end %>

Use d-md-flex on volunteer gallery


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Pullhub!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            Toggle navigation

          </button>
          PullHub

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

        <%= render @view_module, @view_template, assigns %>

Remove header from auth layout

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Pullhub!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

  <body>
    <div class="container">
      <main role="main">
        <%= render @view_module, @view_template, assigns %>
      </main>
    </div>
    <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
  </body>
</html>


<nav class="navbar navbar-light bg-faded">
  <%= link "Classlab", to: page_path(@conn, :index), class: "navbar-brand" %>

  <ul class="nav navbar-nav ">
    <%= content_tag :li, class: "nav-item #{if(@conn.path_info == ["events"], do: " active")}" do %>
      <%= link "Events", to: event_path(@conn, :index), class: "nav-link" %>
    <% end %>
  </ul>
</nav>

Add login button to navigation

  <%= link "Classlab", to: page_path(@conn, :index), class: "navbar-brand" %>

    <%= content_tag :li, class: "nav-item #{if(@conn.path_info == ["events"], do: " active")}" do %>
      <%= link "Events", to: event_path(@conn, :index), class: "nav-link" %>
    <% end %>

    <%= content_tag :li, class: "nav-item" do %>
      <%= link "Login", to: session_path(@conn, :new), class: "btn btn-outline-success" %>
    <% end %>


<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

    <%= label f, :name, class: "control-label" %>
    <%= text_input f, :name, class: "form-control" %>
    <%= error_tag f, :name %>

    <%= label f, :username, class: "control-label" %>
    <%= text_input f, :username, class: "form-control" %>
    <%= error_tag f, :username %>

    <%= label f, :password, class: "control-label" %>
    <%= text_input f, :password, class: "form-control" %>
    <%= error_tag f, :password %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>

Use password_input instead of text_input for password

<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

    <%= label f, :name, class: "control-label" %>
    <%= text_input f, :name, class: "form-control" %>
    <%= error_tag f, :name %>

    <%= label f, :username, class: "control-label" %>
    <%= text_input f, :username, class: "form-control" %>
    <%= error_tag f, :username %>

    <%= label f, :password, class: "control-label" %>
    <%= password_input f, :password, class: "form-control" %>
    <%= error_tag f, :password %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>


<img src='<%= static_path(@conn, "/images/readerl-icon-text.png") %>' alt='ReadErl' width='227' height='48'/>™

An RSS feed aggregator written in Elixir/Phoenix

I'm working on it: github.com/billstclair/readerl

  <%= :erlang.system_info(:system_version) %>

  Erlang: <%= {:ok, version} = :file.read_file(:filename.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"])); Regex.named_captures(~r/(?<v>.*)\n*/, version)["v"] %>,
  Elixir: <%= System.version %>,
  Phoenix: <%= {:ok, vsn} = :application.get_key(:phoenix, :vsn); vsn %>

Add line breaks to long line on index page.

<img src='<%= static_path(@conn, "/images/readerl-icon-text.png") %>' alt='ReadErl' width='227' height='48'/>™

An RSS feed aggregator written in Elixir/Phoenix

I'm working on it: github.com/billstclair/readerl

  <%= :erlang.system_info(:system_version) %>

  Erlang: <%= {:ok, version} =
                :file.read_file(
                  :filename.join(
                    [:code.root_dir(), "releases",
                     :erlang.system_info(:otp_release),
                     "OTP_VERSION"]))
              Regex.named_captures(~r/(?<v>.*)\n*/, version)["v"] %>,
  Elixir: <%= System.version %>,
  Phoenix: <%= {:ok, vsn} = :application.get_key(:phoenix, :vsn); vsn %>


defmodule <%= module_prefix %>.Repo.Migrations.Guardian.DB do
  use Ecto.Migration

  def change do
    create table(:guardian_tokens, primary_key: false<%= if not is_nil(db_prefix), do: ", prefix: \"#{db_prefix}\"" %>) do
      add(:jti, :string, primary_key: true)
      add(:aud, :string, primary_key: true)
      add(:typ, :string)
      add(:iss, :string)
      add(:sub, :string)
      add(:exp, :bigint)
      add(:jwt, :text)
      add(:claims, :map)
      timestamps()
    end
  end
end

Improve table name of migration output

defmodule <%= module_prefix %>.Repo.Migrations.CreateGuardianDBTokensTable do
  use Ecto.Migration

  def change do
    create table(:guardian_tokens, primary_key: false<%= if not is_nil(db_prefix), do: ", prefix: \"#{db_prefix}\"" %>) do
      add(:jti, :string, primary_key: true)
      add(:aud, :string, primary_key: true)
      add(:typ, :string)
      add(:iss, :string)
      add(:sub, :string)
      add(:exp, :bigint)
      add(:jwt, :text)
      add(:claims, :map)
      timestamps()
    end
  end
end


<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

The values `%{article_url}` and `%{count}` will be replaced by the URL of the article and the number of view counts.

For example, the following text: Congratulations, your article %{article_url} has had an increase of %{count} views.

Will result in the message: Congratulations, your article http://www.example.com/article/my-article has had an increase of 75 views.

    <%= label f, :text, class: "form__label" %>
    <%= textarea f, :text, class: "form__input" %>
    <%= error_tag f, :text %>

    <%= label f, :type, class: "form__label" %>
    <%= select f, :type, notification_types, class: "form-control", prompt: "Select notification type" %>
    <%= error_tag f, :type %>

    <%= submit "Submit", class: "btn btn-primary" %>

<% end %>

Add more copy and placeholder

  <%= form_for @changeset, @action, fn f -> %>
    <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

    <% end %>

View Count Spike Notification

The values %{article_url} and %{count} will be replaced by the URL of the article and the number of view counts.

Source Spike Notification

The values %{article_url} and %{source} will be replaced by the URL of the article and the name of the source viewers are coming from.

      <%= label f, :text, class: "form__label" %>
      <%= textarea f, :text, class: "form__input", placeholder: "Your article %{article_url} is very popular at the moment, the pageviews increased by %{count} in the last half an hour." %>
      <%= error_tag f, :text %>

      <%= label f, :type, class: "form__label" %>
      <%= select f, :type, notification_types, class: "form-control", prompt: "Select notification type" %>
      <%= error_tag f, :type %>

      <%= submit "Submit", class: "btn btn-primary" %>

  <% end %>


ReadErl

An RSS feed aggregator written in Elixir/Phoenix

I'm working on it: github.com/billstclair/readerl

  <%= :erlang.system_info(:system_version) %>

  Elixir: <%= System.version %>, Phoenix: <%= Phoenix.Mixfile.project[:version] %>

Fix Phoenix version fetch code

ReadErl

An RSS feed aggregator written in Elixir/Phoenix

I'm working on it: github.com/billstclair/readerl

  <%= :erlang.system_info(:system_version) %>

  Elixir: <%= System.version %>, Phoenix: <%= {_, _, vsn} = List.keyfind(Application.loaded_applications, :phoenix, 0); vsn %>


defmodule <%= @mod_name %>.MixFile do
  use Mix.Project

  def project do
    [
      app: :<%= @app_name %>,
      version: "0.1.0",
      elixir: "~> <%= @elixir_version %>",
      start_permanent: Mix.env == :prod,
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    []
  end
end

Add serum as a dependency of new website projects

defmodule <%= @mod_name %>.MixFile do
  use Mix.Project

  def project do
    [
      app: :<%= @app_name %>,
      version: "0.1.0",
      elixir: "~> <%= @elixir_version %>",
      start_permanent: Mix.env == :prod,
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    [
      {:serum, git: "https://github.com/Dalgona/Serum.git", branch: "master"}
    ]
  end
end


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello RemoteRetro!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= render @view_module, @view_template, assigns %>

Add semantic ui via CDN

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Hello RemoteRetro!</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.7/semantic.min.css">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= render @view_module, @view_template, assigns %>


  <%= if @page_number > 1 do %>
    <%= link(gettext("Previous"),
      to: admin_offer_path(@conn, @method, page: @page_number - 1),
      class: "item item-older") %>
  <% else %>
    <%= gettext("Previous") %>
  <% end %>
  <%= if @page_number < @total_pages do %>
    <%= link(gettext("Next"),
      to: admin_offer_path(@conn, @method, page: @page_number + 1),
      class: "item item-newer") %>
  <% else %>
    <%= gettext("Next") %>
  <% end %>

Fix pagination in admin side

      <%= if @page_number > 1 do %>
        <%= link(gettext("Previous page"),
          to: admin_offer_path(@conn, @method, page: @page_number - 1),
          class: "pagination-link") %>
      <% else %>
        <%= gettext("Previous page") %>
      <% end %>

      <%= if @page_number < @total_pages do %>
        <%= link(gettext("Next page"),
          to: admin_offer_path(@conn, @method, page: @page_number + 1),
          class: "pagination-link") %>
      <% else %>
        <%= gettext("Next page") %>
      <% end %>


Listing game nights

      Yyyymmdd
      Buy in cents

<%= for game_night <- @game_nights do %>

      <%= game_night.yyyymmdd %>
      <%= game_night.buy_in_cents %>

        <%= link "Show", to: game_night_path(@conn, :show, game_night), class: "btn btn-default btn-xs" %>
        <%= link "Edit", to: game_night_path(@conn, :edit, game_night), class: "btn btn-default btn-xs" %>
        <%= link "Delete", to: game_night_path(@conn, :delete, game_night), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

<% end %>

<%= link "New game night", to: game_night_path(@conn, :new) %>

Fix show/edit links to show current_attendance for those nights.

Listing game nights

      Yyyymmdd
      Buy in cents

<%= for game_night <- @game_nights do %>

      <%= game_night.yyyymmdd %>
      <%= game_night.buy_in_cents %>

        <%= link "Show", to: game_night_path(@conn, :current_attendance, game_night), class: "btn btn-default btn-xs" %>
        <%= link "Edit", to: game_night_path(@conn, :current_attendance, game_night), class: "btn btn-default btn-xs" %>
        <%= link "Delete", to: game_night_path(@conn, :delete, game_night), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

<% end %>

<%= link "New game night", to: game_night_path(@conn, :new) %>


Phoenix Poker

  <%= if @current_user do %>

Welcome, <%= @current_user.name %>!

    <img src="<%= @current_user.avatar %>" class="img-circle"/>
    <%= link "Logout", to: auth_path(@conn, :delete), method: :delete, class: "btn btn-danger" %>

  <% else %>

      Sign in with GitHub

      Sign in with Facebook

      Sign in with Google

      Sign in with Twitter

  <% end %>

Add links to homepage: add player, list games.

Phoenix Poker

  <%= if @current_user do %>

Welcome, <%= @current_user.name %>!

    <img src="<%= @current_user.avatar %>" class="img-circle"/>
    <%= link "Logout", to: auth_path(@conn, :delete), method: :delete, class: "btn btn-danger" %>

    <%= link "Add Player", to: player_path(@conn, :new) %>
    |
    <%= link "Game Nights", to: game_night_path(@conn, :index) %>
  <% else %>

      Sign in with GitHub

      Sign in with Facebook

      Sign in with Google

      Sign in with Twitter

  <% end %>


<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Überauth Example</title>
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">

              View on GitHub

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

      <%= render @view_module, @view_template, assigns %>

Fix broken link to github repository