diff options
author | marvin-borner@live.com | 2018-04-16 21:09:05 +0200 |
---|---|---|
committer | marvin-borner@live.com | 2018-04-16 21:09:05 +0200 |
commit | cf14306c2b3f82a81f8d56669a71633b4d4b5fce (patch) | |
tree | 86700651aa180026e89a66064b0364b1e4346f3f /main/app/sprinkles/admin/templates | |
parent | 619b01b3615458c4ed78bfaeabb6b1a47cc8ad8b (diff) |
Main merge to user management system - files are now at /main/public/
Diffstat (limited to 'main/app/sprinkles/admin/templates')
35 files changed, 2244 insertions, 0 deletions
diff --git a/main/app/sprinkles/admin/templates/forms/group.html.twig b/main/app/sprinkles/admin/templates/forms/group.html.twig new file mode 100755 index 0000000..36d6632 --- /dev/null +++ b/main/app/sprinkles/admin/templates/forms/group.html.twig @@ -0,0 +1,69 @@ +<form class="js-form" method="{{form.method | default('POST')}}" action="{{site.uri.public}}/{{form.action}}"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <div class="row"> + {% block group_form %} + {% if 'name' not in form.fields.hidden %} + <div class="col-sm-12"> + <div class="form-group"> + <label>{{translate("GROUP.NAME")}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-edit fa-fw"></i></span> + <input type="text" class="form-control" name="name" autocomplete="off" value="{{group.name}}" placeholder="{{translate("GROUP.NAME_EXPLAIN")}}" {% if 'name' in form.fields.disabled %}disabled{% endif %}> + </div> + </div> + </div> + {% endif %} + {% if 'slug' not in form.fields.hidden %} + <div class="col-sm-12"> + <div class="form-group"> + <label>{{translate("SLUG")}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-tag fa-fw"></i></span> + <input type="text" class="form-control" name="slug" autocomplete="off" value="{{group.slug}}" placeholder="{{translate("SLUG")}}" {% if 'slug' in form.fields.disabled %}disabled{% endif %} readonly> + {% if 'slug' not in form.fields.disabled %} + <span class="input-group-btn" data-toggle="buttons"> + <label class="btn btn-primary"> + <input type="checkbox" id="form-group-slug-override" autocomplete="off"> {{translate("OVERRIDE")}} + </label> + </span> + {% endif %} + </div> + </div> + </div> + {% endif %} + {% if 'icon' not in fields.hidden %} + <div class="col-sm-12"> + <div class="form-group"> + <label>{{translate("GROUP.ICON")}}</label> + <div class="input-group"> + <span class="input-group-addon icon-preview"><i class="{{group.icon}} fa-fw"></i></span> + <input type="text" class="form-control" name="icon" autocomplete="off" value="{{group.icon}}" placeholder="{{translate("GROUP.ICON_EXPLAIN")}}" {% if 'icon' in form.fields.disabled %}disabled{% endif %}> + </div> + </div> + </div> + {% endif %} + {% if 'description' not in fields.hidden %} + <div class="col-sm-12"> + <div class="form-group"> + <label for="input_description">{{translate("DESCRIPTION")}}</label> + <textarea id="input_description" class="form-control" type="text" name="description" {% if 'description' in form.fields.disabled %}disabled{% endif %} rows=6>{{group.description}}</textarea> + </div> + </div> + {% endif %} + {% endblock %} + </div><br> + <div class="row"> + <div class="col-xs-6 col-sm-4"> + <button type="submit" class="btn btn-block btn-lg btn-success">{{form.submit_text}}</button> + </div> + <div class="col-xs-4 col-sm-3 pull-right"> + <button type="button" class="btn btn-block btn-lg btn-link" data-dismiss="modal">{{translate("CANCEL")}}</button> + </div> + </div> +</form> +<!-- Include validation rules --> +<script> +{% include "pages/partials/page.js.twig" %} +</script> diff --git a/main/app/sprinkles/admin/templates/forms/role.html.twig b/main/app/sprinkles/admin/templates/forms/role.html.twig new file mode 100755 index 0000000..46a4477 --- /dev/null +++ b/main/app/sprinkles/admin/templates/forms/role.html.twig @@ -0,0 +1,56 @@ +<form class="js-form" method="{{form.method | default('POST')}}" action="{{site.uri.public}}/{{form.action}}"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <div class="row"> + {% if 'name' not in form.fields.hidden %} + <div class="col-sm-12"> + <div class="form-group"> + <label>{{translate("ROLE.NAME")}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-edit fa-fw"></i></span> + <input type="text" class="form-control" name="name" autocomplete="off" value="{{role.name}}" placeholder="{{translate("ROLE.NAME_EXPLAIN")}}" {% if 'name' in form.fields.disabled %}disabled{% endif %}> + </div> + </div> + </div> + {% endif %} + {% if 'slug' not in form.fields.hidden %} + <div class="col-sm-12"> + <div class="form-group"> + <label>{{translate("SLUG")}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-tag fa-fw"></i></span> + <input type="text" class="form-control" name="slug" autocomplete="off" value="{{role.slug}}" placeholder="{{translate("SLUG")}}" {% if 'slug' in form.fields.disabled %}disabled{% endif %} readonly> + {% if 'slug' not in form.fields.disabled %} + <span class="input-group-btn" data-toggle="buttons"> + <label class="btn btn-primary"> + <input type="checkbox" id="form-role-slug-override" autocomplete="off"> {{translate("OVERRIDE")}} + </label> + </span> + {% endif %} + </div> + </div> + </div> + {% endif %} + {% if 'description' not in fields.hidden %} + <div class="col-sm-12"> + <div class="form-group"> + <label for="input_description">{{translate("DESCRIPTION")}}</label> + <textarea id="input_description" class="form-control" type="text" name="description" {% if 'description' in form.fields.disabled %}disabled{% endif %} rows=6>{{role.description}}</textarea> + </div> + </div> + {% endif %} + </div><br> + <div class="row"> + <div class="col-xs-8 col-sm-4"> + <button type="submit" class="btn btn-block btn-lg btn-success">{{form.submit_text}}</button> + </div> + <div class="col-xs-4 col-sm-4 pull-right"> + <button type="button" class="btn btn-block btn-lg btn-link" data-dismiss="modal">{{translate("CANCEL")}}</button> + </div> + </div> +</form> +<!-- Include validation rules --> +<script> +{% include "pages/partials/page.js.twig" %} +</script> diff --git a/main/app/sprinkles/admin/templates/forms/user.html.twig b/main/app/sprinkles/admin/templates/forms/user.html.twig new file mode 100755 index 0000000..3ee7fc9 --- /dev/null +++ b/main/app/sprinkles/admin/templates/forms/user.html.twig @@ -0,0 +1,125 @@ +<form class="js-form" method="{{form.method | default('POST')}}" action="{{site.uri.public}}/{{form.action}}"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <div class="row"> + {% block user_form %} + {% if 'user_name' not in form.fields.hidden %} + <div class="col-sm-6"> + <div class="form-group"> + <label>{{translate('USERNAME')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-edit fa-fw"></i></span> + <input type="text" class="form-control" name="user_name" autocomplete="off" value="{{user.user_name}}" placeholder="{{translate('USERNAME')}}" {% if 'user_name' in form.fields.disabled %}disabled{% endif %}> + </div> + </div> + </div> + {% endif %} + {% if 'group' not in form.fields.hidden %} + <div class="col-sm-6"> + <div class="form-group"> + <label for="input-group">{{translate('GROUP')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-users fa-fw"></i></span> + {% if 'group' in form.fields.disabled %} + <input type="text" class="form-control" name="theme" value="{{user.group.name}}" disabled> + {% else %} + <select id="input-group" class="form-control js-select2" name="group_id"> + {% for group in groups %} + <option value="{{group.id}}" {% if (group.id == user.group_id) %}selected{% endif %}>{{group.name}}</option> + {% endfor %} + </select> + {% endif %} + </div> + </div> + </div> + {% endif %} + {% if 'name' not in form.fields.hidden %} + <div class="col-sm-6"> + <div class="form-group"> + <label>{{translate('FIRST_NAME')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-edit fa-fw"></i></span> + <input type="text" class="form-control" name="first_name" autocomplete="off" value="{{user.first_name}}" placeholder="{{translate('FIRST_NAME')}}" {% if 'name' in form.fields.disabled %}disabled{% endif %}> + </div> + </div> + </div> + <div class="col-sm-6"> + <div class="form-group"> + <label>{{translate('LAST_NAME')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-edit fa-fw"></i></span> + <input type="text" class="form-control" name="last_name" autocomplete="off" value="{{user.last_name}}" placeholder="{{translate('LAST_NAME')}}" {% if 'name' in form.fields.disabled %}disabled{% endif %}> + </div> + </div> + </div> + {% endif %} + {% if 'email' not in form.fields.hidden %} + <div class="col-sm-6"> + <div class="form-group"> + <label>{{translate('EMAIL')}}</label> + <div class="input-group js-copy-container"> + <span class="input-group-addon"><i class="fa fa-envelope fa-fw"></i></span> + <input type="text" class="form-control js-copy-target" name="email" autocomplete="off" value="{{user.email}}" placeholder="{{translate('EMAIL')}}" {% if 'email' in form.fields.disabled %}disabled{% endif %}> + {% if 'email' in form.fields.disabled %} + <span class="input-group-btn"> + <button class="btn btn-default uf-copy-trigger js-copy-trigger" type="button"><i class="fa fa-clipboard"></i></button> + </span> + {% endif %} + </div> + </div> + </div> + {% endif %} + {% if 'theme' not in form.fields.hidden %} + <div class="col-sm-6"> + <div class="form-group"> + <label for="input-theme">{{translate('THEME')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-puzzle-piece fa-fw"></i></span> + {% if 'theme' in form.fields.disabled %} + <input type="text" class="form-control" name="theme" value="{{themes[user.theme]}}" disabled> + {% else %} + <select id="input-theme" class="form-control js-select2" name="theme"> + {% for option, label in theme %} + <option value="{{option}}" {% if (option == user.theme) %}selected{% endif %}>{{label}}</option> + {% endfor %} + </select> + {% endif %} + </div> + </div> + </div> + {% endif %} + {% if 'locale' not in form.fields.hidden %} + <div class="col-sm-6"> + <div class="form-group"> + <label for="input-locale">{{translate('LOCALE')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-language fa-fw"></i></span> + {% if 'locale' in form.fields.disabled %} + <input type="text" class="form-control" name="theme" value="{{locales[user.locale]}}" disabled> + {% else %} + <select id="input-locale" class="form-control js-select2" name="locale"> + {% for option, label in locales %} + <option value="{{option}}" {% if (option == user.locale) %}selected{% endif %}>{{label}}</option> + {% endfor %} + </select> + {% endif %} + </div> + </div> + </div> + {% endif %} + {% endblock %} + </div><br> + <div class="row"> + <div class="col-xs-8 col-sm-4"> + <button type="submit" class="btn btn-block btn-lg btn-success">{{form.submit_text}}</button> + </div> + <div class="col-xs-4 col-sm-3 pull-right"> + <button type="button" class="btn btn-block btn-lg btn-link" data-dismiss="modal">{{translate('CANCEL')}}</button> + </div> + </div> +</form> +<!-- Include validation rules --> +<script> +{% include "pages/partials/page.js.twig" %} +</script> diff --git a/main/app/sprinkles/admin/templates/mail/password-create.html.twig b/main/app/sprinkles/admin/templates/mail/password-create.html.twig new file mode 100755 index 0000000..854eb77 --- /dev/null +++ b/main/app/sprinkles/admin/templates/mail/password-create.html.twig @@ -0,0 +1,19 @@ +{% block subject %} + {{site.title}} - please set a password for your new account +{% endblock %} + +{% block body %} +<p> + Dear {{user.first_name}}, +</p> +<p> + Someone has created an account for you with {{site.title}} ({{site.uri.public}}). Your username is <b>{{user.user_name}}</b>. +</p> +<p> + To access your account, you must first create a password by visiting: <a href="{{site.uri.public}}/account/set-password/confirm?token={{token}}">{{site.uri.public}}/account/set-password/confirm?token={{token}}</a>. This link has been generated especially for you, and will expire in {{create_password_expiration}}. Do not share it with anyone! +</p> +<p> + With regards,<br> + The {{site.title}} Team +</p> +{% endblock %}
\ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/modals/confirm-clear-cache.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-clear-cache.html.twig new file mode 100755 index 0000000..e5457d3 --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/confirm-clear-cache.html.twig @@ -0,0 +1,17 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate("CACHE.CLEAR")}}{% endblock %} + +{% block modal_body %} +<form class="js-form" method="post" action="{{site.uri.public}}/{{form.action}}"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <h4>{{translate("CACHE.CLEAR_CONFIRM")}}<br><small>{{translate("DELETE_CANNOT_UNDONE")}}</small></h4> + <br> + <div class="btn-group-action"> + <button type="submit" class="btn btn-danger btn-lg btn-block">{{translate("CACHE.CLEAR_CONFIRM_YES")}}</button> + <button type="button" class="btn btn-default btn-lg btn-block" data-dismiss="modal">{{translate("CANCEL")}}</button> + </div> +</form> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/confirm-delete-group.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-delete-group.html.twig new file mode 100755 index 0000000..7889a1e --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/confirm-delete-group.html.twig @@ -0,0 +1,17 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate("GROUP.DELETE")}}{% endblock %} + +{% block modal_body %} +<form class="js-form" method="delete" action="{{site.uri.public}}/{{form.action}}"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <h4>{{translate("GROUP.DELETE_CONFIRM", {name: group.name})}}<br><small>{{translate("DELETE_CANNOT_UNDONE")}}</small></h4> + <br> + <div class="btn-group-action"> + <button type="submit" class="btn btn-danger btn-lg btn-block">{{translate("GROUP.DELETE_YES")}}</button> + <button type="button" class="btn btn-default btn-lg btn-block" data-dismiss="modal">{{translate("CANCEL")}}</button> + </div> +</form> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/confirm-delete-role.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-delete-role.html.twig new file mode 100755 index 0000000..618039b --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/confirm-delete-role.html.twig @@ -0,0 +1,17 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate("ROLE.DELETE")}}{% endblock %} + +{% block modal_body %} +<form class="js-form" method="delete" action="{{site.uri.public}}/{{form.action}}"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <h4>{{translate("ROLE.DELETE_CONFIRM", {name: role.name})}}<br><small>{{translate("DELETE_CANNOT_UNDONE")}}</small></h4> + <br> + <div class="btn-group-action"> + <button type="submit" class="btn btn-danger btn-lg btn-block">{{translate("ROLE.DELETE_YES")}}</button> + <button type="button" class="btn btn-default btn-lg btn-block" data-dismiss="modal">{{translate("CANCEL")}}</button> + </div> +</form> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/confirm-delete-user.html.twig b/main/app/sprinkles/admin/templates/modals/confirm-delete-user.html.twig new file mode 100755 index 0000000..ce86301 --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/confirm-delete-user.html.twig @@ -0,0 +1,17 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate("USER.DELETE")}}{% endblock %} + +{% block modal_body %} +<form class="js-form" method="delete" action="{{site.uri.public}}/{{form.action}}"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <h4>{{translate("USER.DELETE_CONFIRM", {name: user.user_name})}}<br><small>{{translate("DELETE_CANNOT_UNDONE")}}</small></h4> + <br> + <div class="btn-group-action"> + <button type="submit" class="btn btn-danger btn-lg btn-block">{{translate("USER.DELETE_YES")}}</button> + <button type="button" class="btn btn-default btn-lg btn-block" data-dismiss="modal">{{translate("CANCEL")}}</button> + </div> +</form> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/group.html.twig b/main/app/sprinkles/admin/templates/modals/group.html.twig new file mode 100755 index 0000000..be2d98c --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/group.html.twig @@ -0,0 +1,7 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate('GROUP')}}{% endblock %} + +{% block modal_body %} + {% include "forms/group.html.twig" %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/role-manage-permissions.html.twig b/main/app/sprinkles/admin/templates/modals/role-manage-permissions.html.twig new file mode 100755 index 0000000..3914d2e --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/role-manage-permissions.html.twig @@ -0,0 +1,94 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate("PERMISSION.MANAGE")}}{% endblock %} + +{% block modal_size %}modal-lg{% endblock %} + +{% block modal_body %} +<form class="js-form" method="PUT" action="{{site.uri.public}}/api/roles/r/{{role.slug}}/permissions"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <div class="js-form-permissions"> + <table class="table table-striped"> + <thead> + <tr> + <th>{{translate("NAME")}}</th> + <th>{{translate("DESCRIPTION")}}</th> + <th>{{translate("PERMISSION.HOOK_CONDITION")}}</th> + <th>{{translate("REMOVE")}}</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + <div class="padding-bottom"> + <label>{{translate("PERMISSION.ASSIGN_NEW")}}:</label> + <select class="form-control js-select-new" type="text"> + <option></option> + </select> + </div> + </div> + <br> + <div class="row"> + <div class="col-xs-12 col-sm-6"> + <button type="submit" class="btn btn-block btn-lg btn-success">{{translate("PERMISSION.UPDATE")}}</button> + </div> + <div class="col-xs-12 col-sm-3 pull-right"> + <button type="button" class="btn btn-block btn-lg btn-link" data-dismiss="modal">{{translate('CANCEL')}}</button> + </div> + </div> +</form> + +{# This contains a series of <script> blocks, each of which is a client-side Handlebars template. + # Note that these are NOT Twig templates, although the syntax is similar. We wrap them in the `verbatim` tag, + # so that Twig will output them directly into the DOM instead of trying to treat them like Twig templates. + # + # These templates require handlebars-helpers.js, moment.js +#} +{% verbatim %} +<script id="role-permissions-select-option" type="text/x-handlebars-template"> + <div> + <strong> + {{name}} + </strong> + <br> + {{description}} + <div> + <code>{{this.slug}}</code> + </div> + <div> + ↳ <code>{{conditions}}</code> + </div> + </div> +</script> + +<script id="role-permissions-row" type="text/x-handlebars-template"> + <tr class="uf-collection-row"> + <td> + {{name}} + <input type="hidden" name="value[{{ rownum }}][permission_id]" value="{{id}}"> + </td> + <td> + {{description}} + </td> + <td class="uf-collection-col-wrap"> + <div> + <code>{{this.slug}}</code> + </div> + <div> + ↳ <code>{{conditions}}</code> + </div> + </td> + <td> + <button type="button" class="btn btn-link btn-trash js-delete-row pull-right" title="Delete"> <i class="fa fa-trash"></i> </button> + </td> + </tr> +</script> +{% endverbatim %} + +<!-- Include validation rules --> +<script> + {% include "pages/partials/page.js.twig" %} +</script> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/role.html.twig b/main/app/sprinkles/admin/templates/modals/role.html.twig new file mode 100755 index 0000000..6346461 --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/role.html.twig @@ -0,0 +1,7 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate('ROLE')}}{% endblock %} + +{% block modal_body %} + {% include "forms/role.html.twig" %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/user-manage-roles.html.twig b/main/app/sprinkles/admin/templates/modals/user-manage-roles.html.twig new file mode 100755 index 0000000..b41c60b --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/user-manage-roles.html.twig @@ -0,0 +1,77 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate("ROLE.MANAGE")}}{% endblock %} + +{% block modal_body %} +<form class="js-form" method="PUT" action="{{site.uri.public}}/api/users/u/{{user.user_name}}/roles"> + {% include "forms/csrf.html.twig" %} + <div class="js-form-alerts"> + </div> + <div class="js-form-roles"> + <table class="table table-striped"> + <thead> + <tr> + <th>{{translate("NAME")}}</th> + <th>{{translate("DESCRIPTION")}}</th> + <th>{{translate("REMOVE")}}</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + <div class="padding-bottom"> + <label>{{translate("ROLE.ASSIGN_NEW")}}:</label> + <select class="form-control js-select-new" type="text"> + <option></option> + </select> + </div> + </div> + <br> + <div class="row"> + <div class="col-xs-8 col-sm-4"> + <button type="submit" class="btn btn-block btn-lg btn-success">{{translate("UPDATE")}}</button> + </div> + <div class="col-xs-4 col-sm-3 pull-right"> + <button type="button" class="btn btn-block btn-lg btn-link" data-dismiss="modal">{{translate('CANCEL')}}</button> + </div> + </div> +</form> + +{# This contains a series of <script> blocks, each of which is a client-side Handlebars template. + # Note that these are NOT Twig templates, although the syntax is similar. We wrap them in the `verbatim` tag, + # so that Twig will output them directly into the DOM instead of trying to treat them like Twig templates. + # + # These templates require handlebars-helpers.js, moment.js +#} +{% verbatim %} +<script id="user-roles-select-option" type="text/x-handlebars-template"> + <div> + <strong> + {{name}} + </strong> + <br> + {{description}} + </div> +</script> + +<script id="user-roles-row" type="text/x-handlebars-template"> + <tr class="uf-collection-row"> + <td> + {{name}} + <input type="hidden" name="value[{{ rownum }}][role_id]" value="{{id}}"> + </td> + <td> + {{description}} + </td> + <td> + <button type="button" class="btn btn-link btn-trash js-delete-row pull-right" title="Delete"> <i class="fa fa-trash"></i> </button> + </td> + </tr> +</script> +{% endverbatim %} + +<!-- Include validation rules --> +<script> + {% include "pages/partials/page.js.twig" %} +</script> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/user-set-password.html.twig b/main/app/sprinkles/admin/templates/modals/user-set-password.html.twig new file mode 100755 index 0000000..922d4e2 --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/user-set-password.html.twig @@ -0,0 +1,62 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate("USER.ADMIN.CHANGE_PASSWORD")}}{% endblock %} + +{% block modal_body %} +<form class="js-form" method="PUT" action="{{site.uri.public}}/api/users/u/{{user.user_name}}"> + {% include "forms/csrf.html.twig" %} + <!-- Prevent browsers from trying to autofill the password field. See http://stackoverflow.com/a/23234498/2970321 --> + <input type="text" style="display:none"> + <input type="password" style="display:none"> + <div class="js-form-alerts"> + </div> + <div class="row"> + <div class="col-sm-12"> + <div class="radio"> + <label for="change_password_mode_link"> + <input type="radio" name="change_password_mode" id="change_password_mode_link" value="link" checked> + {{translate("USER.ADMIN.SEND_PASSWORD_LINK")}} + </label> + </div> + </div> + <div class="col-sm-12"> + <div class="radio"> + <label for="change_password_mode_manual"> + <input type="radio" name="change_password_mode" id="change_password_mode_manual" value="manual"> + {{translate("USER.ADMIN.SET_PASSWORD")}}: + </label> + </div> + <div class="row controls-password"> + <div class="col-sm-11 col-sm-offset-1"> + <div class="form-group"> + <label>{{translate('PASSWORD')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-key"></i></span> + <input type="password" class="form-control" name="value" autocomplete="off" value="" placeholder="{{translate("PASSWORD.BETWEEN", {min: 12, max: 50})}}"> + </div> + </div> + <div class="form-group"> + <label>{{translate('PASSWORD.CONFIRM')}}</label> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-key"></i></span> + <input type="password" class="form-control" name="passwordc" autocomplete="off" value="" placeholder="{{translate('PASSWORD.CONFIRM')}}"> + </div> + </div> + </div> + </div> + </div> + </div><br> + <div class="row"> + <div class="col-xs-8 col-sm-4"> + <button type="submit" class="btn btn-block btn-lg btn-success">{{translate('SUBMIT')}}</button> + </div> + <div class="col-xs-4 col-sm-3 pull-right"> + <button type="button" class="btn btn-block btn-lg btn-link" data-dismiss="modal">{{translate('CANCEL')}}</button> + </div> + </div> +</form> +<!-- Include validation rules --> +<script> + {% include "pages/partials/page.js.twig" %} +</script> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/modals/user.html.twig b/main/app/sprinkles/admin/templates/modals/user.html.twig new file mode 100755 index 0000000..892fe4f --- /dev/null +++ b/main/app/sprinkles/admin/templates/modals/user.html.twig @@ -0,0 +1,7 @@ +{% extends "modals/modal.html.twig" %} + +{% block modal_title %}{{translate('USER')}}{% endblock %} + +{% block modal_body %} + {% include "forms/user.html.twig" %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/navigation/navbar.html.twig b/main/app/sprinkles/admin/templates/navigation/navbar.html.twig new file mode 100755 index 0000000..b2cf699 --- /dev/null +++ b/main/app/sprinkles/admin/templates/navigation/navbar.html.twig @@ -0,0 +1,15 @@ +{% block dashboard_navbar %} + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + {% if current_user.isMaster() %} + <li class="hidden-xs hidden-sm"><a href="#">{{ translate("HEADER_MESSAGE_ROOT") | upper }}</a></li> + {% endif %} + + {# additional elements (e.g., menus, messages) before the user account drop down #} + {% block dashboard_navbar_extra %} {% endblock %} + + {# User Account: style can be found in dropdown.less #} + {% include "navigation/user-card.html.twig" %} + </ul> + </div> +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/navigation/sidebar-menu.html.twig b/main/app/sprinkles/admin/templates/navigation/sidebar-menu.html.twig new file mode 100755 index 0000000..bde2674 --- /dev/null +++ b/main/app/sprinkles/admin/templates/navigation/sidebar-menu.html.twig @@ -0,0 +1,43 @@ +{% block navigation %} + {% if checkAccess('uri_dashboard') %} + <li> + <a href="{{site.uri.public}}/dashboard"><i class="fa fa-dashboard fa-fw"></i> <span>{{ translate("DASHBOARD") }}</span></a> + </li> + {% endif %} + {% if checkAccess('uri_users') %} + <li> + <a href="{{site.uri.public}}/users"><i class="fa fa-user fa-fw"></i> <span>{{ translate("USER", 2) }}</span></a> + </li> + {% elseif checkAccess('uri_group', { + 'group': current_user.group + }) %} + <li> + <a href="{{site.uri.public}}/groups/g/{{current_user.group.slug}}"><i class="{{current_user.group.icon}} fa-fw"></i> <span>{{ translate("GROUP.MANAGE") }}</span></a> + </li> + {% endif %} + {% if checkAccess('uri_activities') %} + <li> + <a href="{{site.uri.public}}/activities"><i class="fa fa-tasks fa-fw"></i> <span>{{ translate("ACTIVITY", 2) }}</span></a> + </li> + {% endif %} + {% if checkAccess('uri_roles') %} + <li> + <a href="{{site.uri.public}}/roles"><i class="fa fa-drivers-license fa-fw"></i> <span>{{ translate("ROLE", 2) }}</span></a> + </li> + {% endif %} + {% if checkAccess('uri_permissions') %} + <li> + <a href="{{site.uri.public}}/permissions"><i class="fa fa-key fa-fw"></i> <span>{{ translate("PERMISSION", 2) }}</span></a> + </li> + {% endif %} + {% if checkAccess('uri_groups') %} + <li> + <a href="{{site.uri.public}}/groups"><i class="fa fa-users fa-fw"></i> <span>{{ translate("GROUP", 2) }}</span></a> + </li> + {% endif %} + {% if checkAccess('update_site_config') %} + <li> + <a href="{{site.uri.public}}/settings"><i class="fa fa-gears fa-fw"></i> <span>{{ translate("SITE.CONFIG.MANAGER") }}</span></a> + </li> + {% endif %} +{% endblock %}
\ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/navigation/sidebar-user.html.twig b/main/app/sprinkles/admin/templates/navigation/sidebar-user.html.twig new file mode 100755 index 0000000..018e644 --- /dev/null +++ b/main/app/sprinkles/admin/templates/navigation/sidebar-user.html.twig @@ -0,0 +1,10 @@ +<!-- Sidebar user panel --> +<div class="user-panel"> + <div class="pull-left image"> + <img src="{{ current_user.avatar }}" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>{{current_user.first_name}} {{current_user.last_name}}</p> + <i class="{{current_user.group.icon}}"></i> {{current_user.group.name}} + </div> +</div>
\ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/navigation/sidebar.html.twig b/main/app/sprinkles/admin/templates/navigation/sidebar.html.twig new file mode 100755 index 0000000..1b2939e --- /dev/null +++ b/main/app/sprinkles/admin/templates/navigation/sidebar.html.twig @@ -0,0 +1,10 @@ +{% block sidebar_user %} + {% include 'navigation/sidebar-user.html.twig' %} +{% endblock %} + +{% block sidebar_menu %} +<ul class="sidebar-menu"> + <li class="header" style="text-transform: uppercase">{{translate('NAVIGATION')}}</li> + {% include 'navigation/sidebar-menu.html.twig' %} +</ul> +{% endblock %}
\ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/navigation/user-card.html.twig b/main/app/sprinkles/admin/templates/navigation/user-card.html.twig new file mode 100755 index 0000000..36fdb4b --- /dev/null +++ b/main/app/sprinkles/admin/templates/navigation/user-card.html.twig @@ -0,0 +1,8 @@ +{% extends "@account/navigation/user-card.html.twig" %} + +{% block userCard_menu %} + {% if checkAccess('uri_dashboard') %} + <a href="{{site.uri.public}}/dashboard" class="btn btn-default btn-flat btn-block">{{translate("DASHBOARD")}}</a> + {% endif %} + {{ parent() }} +{% endblock %}
\ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/pages/abstract/dashboard.html.twig b/main/app/sprinkles/admin/templates/pages/abstract/dashboard.html.twig new file mode 100755 index 0000000..2a53de4 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/abstract/dashboard.html.twig @@ -0,0 +1,87 @@ +{% extends "pages/abstract/base.html.twig" %} + +{% block stylesheets_page_group %} + <!-- Page-group-specific CSS asset bundle --> + {{ assets.css('css/admin') | raw }} +{% endblock %} + +{% block body_attributes %} + {% if current_user.isMaster() %} + class="hold-transition skin-red sidebar-mini" + {% else %} + class="hold-transition skin-{{site.AdminLTE.skin}} sidebar-mini" + {% endif %} +{% endblock %} + +{% block content %} + {# This needs to be here (early in the body) to make sure the animation doesn't fire #} + <script> + (function () { + if (Boolean(sessionStorage.getItem('sidebar-toggle-collapsed'))) { + var body = document.getElementsByTagName('body')[0]; + body.className = body.className + ' sidebar-collapse'; + } + })(); + </script> + + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + {% block navbar_logo %} + <a href="{{site.uri.public}}" class="logo"> + <i class="fa fa-home"></i> + {{site.title}} + </a> + {% endblock %} + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <!-- Main nav buttons --> + {% include "navigation/navbar.html.twig" %} + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + {% include 'navigation/sidebar.html.twig' %} + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + {% block content_header %} + <section class="content-header"> + <h1>{% block header_title %}{{ block('page_title') }}{% endblock %}</h1> + {% if block('page_description') is not empty %}<h1><small>{% block header_description %}{{ block('page_description') }}{% endblock %}</small></h1>{% endif %} + {% block breadcrumb %} + {% include 'navigation/breadcrumb.html.twig' with {page_title: block('page_title')} %} + {% endblock %} + <div id="alerts-page"></div> + </section> + {% endblock %} + <section class="content"> + {% block body_matter %}{% endblock %} + </section> + </div> + <!-- /.content-wrapper --> + + <!-- Footer --> + {% block footer %} + {% include "pages/partials/footer.html.twig" %} + {% endblock %} + + </div> + <!-- ./wrapper --> + +{% endblock %} + +{% block scripts_page_group %} + {{ assets.js('js/admin') | raw }} +{% endblock %}
\ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/pages/activities.html.twig b/main/app/sprinkles/admin/templates/pages/activities.html.twig new file mode 100755 index 0000000..bcbd9c6 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/activities.html.twig @@ -0,0 +1,46 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("ACTIVITY", 2) }}{% endblock %} + +{% block page_description %}{{ translate("ACTIVITY.PAGE") }}.{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-md-12"> + <div id="widget-activities" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-tasks fa-fw"></i> {{translate('ACTIVITY', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/activities.html.twig" with { + "table" : { + "id" : "table-activities", + "columns" : ["user"] + } + } + %} + </div> + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include validation rules --> + <script> + {% include "pages/partials/page.js.twig" %} + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/activities') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/dashboard.html.twig b/main/app/sprinkles/admin/templates/pages/dashboard.html.twig new file mode 100755 index 0000000..f9c85a3 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/dashboard.html.twig @@ -0,0 +1,282 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("DASHBOARD") }}{% endblock %} +{% block page_description %}{% endblock %} + +{% block body_matter %} + <!-- Info boxes --> + {% if checkAccess('uri_users') %} + <div class="row"> + <div class="col-md-4 col-sm-6 col-xs-12"> + <a href="{{site.uri.public}}/users"> + <div class="info-box"> + <span class="info-box-icon bg-aqua"><i class="fa fa-user fa-fw"></i></span> + <div class="info-box-content"> + <span class="info-box-text">{{ translate("USER", 2) }}</span> + <span class="info-box-number">{{counter.users}}</span> + </div> + <!-- /.info-box-content --> + </div> + <!-- /.info-box --> + </a> + </div> + <!-- /.col --> + + <div class="col-md-4 col-sm-6 col-xs-12"> + <a href="{{site.uri.public}}/roles"> + <div class="info-box"> + <span class="info-box-icon bg-red"><i class="fa fa-drivers-license"></i></span> + <div class="info-box-content"> + <span class="info-box-text">{{ translate("ROLE", 2) }}</span> + <span class="info-box-number">{{counter.roles}}</span> + </div> + <!-- /.info-box-content --> + </div> + <!-- /.info-box --> + </a> + </div> + <!-- /.col --> + + <div class="col-md-4 col-sm-6 col-xs-12"> + <a href="{{site.uri.public}}/groups"> + <div class="info-box"> + <span class="info-box-icon bg-green"><i class="fa fa-users"></i></span> + <div class="info-box-content"> + <span class="info-box-text">{{ translate("GROUP", 2) }}</span> + <span class="info-box-number">{{counter.groups}}</span> + </div> + <!-- /.info-box-content --> + </div> + <!-- /.info-box --> + </a> + </div> + <!-- /.col --> + </div> + <!-- /.row --> + + {% elseif checkAccess('uri_group', { + 'group': current_user.group + }) %} + <div class="row"> + <div class="col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-aqua"><i class="{{current_user.group.icon}}"></i></span> + <div class="info-box-content"> + <h1>{{current_user.group.name}}</h1> + </div> + <!-- /.info-box-content --> + </div> + <!-- /.info-box --> + </div> + <!-- /.col --> + <div class="col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-aqua"><i class="fa fa-user fa-fw"></i></span> + <div class="info-box-content"> + <span class="info-box-text">{{ translate("USER", 2) }}</span> + <span class="info-box-number">{{current_user.group.users.count}}</span> + </div> + <!-- /.info-box-content --> + </div> + <!-- /.info-box --> + </div> + <!-- /.col --> + </div> + <!-- /.row --> + {% endif %} + + <!-- Main panels --> + <div class="row"> + {% if checkAccess('uri_users') or checkAccess('view_system_info') %} + <div class="col-md-6 col-sm-12 col-xs-12"> + {% if checkAccess('uri_users') %} + <div class="row"> + <div class="col-sm-12"> + <!-- USERS LIST --> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">{{translate("USER.LATEST")}}</h3> + </div> + <!-- /.box-header --> + <div class="box-body no-padding"> + <ul class="users-list clearfix"> + {% for user in users %} + <li> + <img src="{{ user.avatar }}" alt="User Image"> + <a class="users-list-name" href="{{site.uri.public}}/users/u/{{user.user_name}}">{{user.first_name}} {{user.last_name}}</a> + <span class="users-list-date">{{ user.registered }}</span> + </li> + {% endfor %} + </ul> + <!-- /.users-list --> + </div> + <!-- /.box-body --> + <div class="box-footer text-center"> + <a href="{{site.uri.public}}/users" class="uppercase">{{translate("USER.VIEW_ALL")}}</a> + </div> + <!-- /.box-footer --> + </div> + <!--/.box --> + </div> + <!-- /.col --> + </div> + <!-- /.row --> + {% endif %} + + {% if checkAccess('view_system_info') %} + <div class="row"> + <div class="col-sm-12"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">{{translate("SYSTEM_INFO")}}</h3> + </div> + <!-- /.box-header --> + <div class="box-body"> + <dl class="dl-horizontal"> + <dt>{{translate("SYSTEM_INFO.UF_VERSION")}}</dt> + <dd>{{info.version.UF}}</dd> + + <dt>{{translate("SYSTEM_INFO.PHP_VERSION")}}</dt> + <dd>{{info.version.php}}</dd> + + <dt>{{translate("SYSTEM_INFO.SERVER")}}</dt> + <dd>{{info.environment.SERVER_SOFTWARE}}</dd> + + <dt>{{translate("SYSTEM_INFO.DB_VERSION")}}</dt> + <dd>{{info.version.database.type}} {{info.version.database.version}}</dd> + + <dt>{{translate("SYSTEM_INFO.DB_NAME")}}</dt> + <dd>{{info.database.name}}</dd> + + <dt>{{translate("SYSTEM_INFO.DIRECTORY")}}</dt> + <dd>{{info.path.project}}</dd> + + <dt>{{translate("SYSTEM_INFO.URL")}}</dt> + <dd>{{site.uri.public}}</dd> + + <dt>{{translate("SYSTEM_INFO.SPRINKLES")}}</dt> + <dd> + <ul class="list-unstyled"> + {% for sprinkle in sprinkles %} + <li> + {{sprinkle}} + </li> + {% endfor %} + </ul> + </dd> + </dl> + </div> + <!-- /.box-body --> + <div class="box-footer text-center"> + <a href="javascript:void(0)" class="js-clear-cache uppercase">{{ translate("CACHE.CLEAR") }}</a> + </div> + <!-- /.box-footer --> + </div> + <!--/.box --> + </div> + <!-- /.col --> + </div> + <!-- /.row --> + {% endif %} + </div> + <!-- /.col --> + {% endif %} + + {% if checkAccess('uri_activities') %} + <div class="col-md-6 col-sm-12 col-xs-12"> + <div id="widget-activities" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-tasks fa-fw"></i> {{translate('ACTIVITY', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/activities.html.twig" with { + "table" : { + "id" : "table-activities", + "columns" : ["user"] + } + } + %} + </div> + </div> + </div> + {% elseif checkAccess('view_group_field', { + 'group': current_user.group, + 'property': 'users' + }) %} + <div class="col-md-6 col-sm-12 col-xs-12"> + <div id="widget-group-users" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-user"></i> {{translate('USER', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-group-users" + } + } + %} + </div> + <div class="box-footer"> + <button type="button" class="btn btn-success js-user-create"> + <i class="fa fa-plus-square"></i> {{translate("USER.CREATE")}} + </button> + </div> + </div> + </div> + {% else %} + <div class="col-sm-4 col-sm-offset-4 col-xs-12"> + <div class="box box-widget widget-user"> + <!-- Add the bg color to the header using any of the bg-* classes --> + <div class="widget-user-header bg-black-active"> + <h3 class="widget-user-username"> + {{translate("WELCOME", { + 'first_name': current_user.first_name + })}} + </h3> + </div> + <div class="widget-user-image"> + <img class="img-circle" src="{{assets.url('assets://userfrosting/images/cupcake.png')}}" alt="User Avatar"> + </div> + <div class="box-footer"> + <h4> + {{translate("WELCOME_TO", { + 'title': site.title + })}} + </h4> + <p> + {{translate("NO_FEATURES_YET")}} + </p> + </div> + </div> + <!-- /.widget-user --> + + + </div> + <!-- /.row --> + {% endif %} + </div> + <!-- /.row --> +{% endblock %} + +{% block scripts_page %} + <!-- Include page variables --> + <script> + {% include "pages/partials/page.js.twig" %} + + // Add user name + page = $.extend( + true, // deep extend + { + "group_slug": "{{current_user.group.slug}}" + }, + page + ); + </script> + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/dashboard') | raw }} + +{% endblock %}
\ No newline at end of file diff --git a/main/app/sprinkles/admin/templates/pages/group.html.twig b/main/app/sprinkles/admin/templates/pages/group.html.twig new file mode 100755 index 0000000..bf4d275 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/group.html.twig @@ -0,0 +1,106 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("GROUP", 2) }} | {{group.name}}{% endblock %} + +{% block page_description %}{{ translate("GROUP.INFO_PAGE", {name: group.name}) }}{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-lg-4"> + <div id="view-group" class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">{{translate('GROUP.SUMMARY')}}</h3> + {% if 'tools' not in tools.hidden %} + <div class="box-tools pull-right"> + <div class="btn-group"> + <button type="button" class="btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="fa fa-gear"></i> <span class="caret"></span> + </button> + <ul class="dropdown-menu box-tool-menu"> + {% block tools %} + <li> + <a href="#" class="js-group-edit" data-slug="{{group.slug}}"> + <i class="fa fa-edit fa-fw"></i> {{translate('EDIT')}} + </a> + </li> + {% if 'delete' not in tools.hidden %} + <li> + <a href="#" class="js-group-delete" data-slug="{{group.slug}}"> + <i class="fa fa-trash-o fa-fw"></i> {{translate('DELETE')}} + </a> + </li> + {% endif %} + {% endblock %} + </ul> + </div> + </div> + {% endif %} + </div> + <div class="box-body box-profile"> + <div class="text-center"> + <i class="{{group.icon}} fa-5x"></i> + </div> + + <h3 class="profile-username text-center">{{group.name}}</h3> + + {% if 'description' not in fields.hidden %} + <p class="text-muted"> + {{group.description}} + </p> + {% endif %} + {% if 'users' not in fields.hidden %} + <hr> + <strong><i class="fa fa-users margin-r-5"></i> {{ translate('USER', 2)}}</strong> + <p class="badge bg-blue box-profile-property"> + {{group.users.count}} + </p> + {% endif %} + {% block group_profile %}{% endblock %} + </div> + </div> + </div> + <div class="col-lg-8"> + <div id="widget-group-users" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-user"></i> {{translate('USER', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-group-users" + } + } + %} + </div> + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include page variables --> + <script> + {% include "pages/partials/page.js.twig" %} + + // Add user name + page = $.extend( + true, // deep extend + { + "group_slug": "{{group.slug}}" + }, + page + ); + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/group') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/groups.html.twig b/main/app/sprinkles/admin/templates/pages/groups.html.twig new file mode 100755 index 0000000..35e9a88 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/groups.html.twig @@ -0,0 +1,52 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("GROUP", 2) }}{% endblock %} + +{% block page_description %}{{ translate("GROUP.PAGE_DESCRIPTION") }}{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-md-12"> + <div id="widget-groups" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-users"></i> {{translate('GROUP', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/groups.html.twig" with { + "table" : { + "id" : "table-groups" + } + } + %} + </div> + {% if checkAccess('create_group') %} + <div class="box-footer"> + <button type="button" class="btn btn-success js-group-create"> + <i class="fa fa-plus-square"></i> {{translate("GROUP.CREATE")}} + </button> + </div> + {% endif %} + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include validation rules --> + <script> + {% include "pages/partials/page.js.twig" %} + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/groups') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/permission.html.twig b/main/app/sprinkles/admin/templates/pages/permission.html.twig new file mode 100755 index 0000000..6adc014 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/permission.html.twig @@ -0,0 +1,91 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-group-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{translate("PERMISSION", 2)}} | {{permission.name}}{% endblock %} + +{% block page_description %}{{translate("PERMISSION.INFO_PAGE", {name: permission.name})}}{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-lg-4"> + <div id="view-permission" class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">{{translate("PERMISSION.SUMMARY")}}</h3> + </div> + <div class="box-body box-profile"> + <div class="text-center"> + <i class="fa fa-key fa-5x"></i> + </div> + + <h3 class="profile-username text-center">{{permission.name}}</h3> + + <p class="text-muted"> + {{permission.description}} + </p> + <hr> + <strong>{{translate("PERMISSION.ID")}}: </strong> + <span class="js-copy-container"> + <span class="js-copy-target" style="margin: 0 5px;">{{permission.id}}</span> + <i class="fa fa-copy text-blue uf-copy-trigger js-copy-trigger"></i> + </span> + <hr> + <strong>{{translate("SLUG_CONDITION")}}</strong> + <br> + <br> + <p> + <code>{{permission.slug}}</code> + </p> + <p> + ↳ <code>{{permission.conditions}}</code> + </p> + </div> + <div class="box-footer"> + {{translate("PERMISSION.NOTE_READ_ONLY")}} + </div> + </div> + </div> + <div class="col-lg-8"> + <div id="widget-permission-users" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-key"></i> {{translate("USER.WITH_PERMISSION")}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-permission-users", + "columns" : ["via_roles"] + } + } + %} + </div> + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include page variables --> + <script> + {% include "pages/partials/page.js.twig" %} + + // Add user name + page = $.extend( + true, // deep extend + { + "permission_id": "{{permission.id}}" + }, + page + ); + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/permission') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/permissions.html.twig b/main/app/sprinkles/admin/templates/pages/permissions.html.twig new file mode 100755 index 0000000..2696209 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/permissions.html.twig @@ -0,0 +1,45 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("PERMISSION", 2)}}{% endblock %} + +{% block page_description %}{{ translate("PERMISSION.PAGE_DESCRIPTION")}}{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-md-12"> + <div id="widget-permissions" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title pull-left"><i class="fa fa-key fa-fw"></i> {{translate('PERMISSION', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/permissions.html.twig" with { + "table" : { + "id" : "table-permissions" + } + } + %} + </div> + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include validation rules --> + <script> + {% include "pages/partials/page.js.twig" %} + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/permissions') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/role.html.twig b/main/app/sprinkles/admin/templates/pages/role.html.twig new file mode 100755 index 0000000..daf1004 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/role.html.twig @@ -0,0 +1,129 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-group-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{translate("ROLE", 2)}} | {{role.name}}{% endblock %} + +{% block page_description %}{{translate("ROLE.INFO_PAGE", {name: role.name})}}{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-lg-4"> + <div id="view-role" class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">{{translate('ROLE.SUMMARY')}}</h3> + {% if 'tools' not in tools.hidden %} + <div class="box-tools pull-right"> + <div class="btn-group"> + <button type="button" class="btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="fa fa-gear"></i> <span class="caret"></span> + </button> + <ul class="dropdown-menu box-tool-menu"> + {% block tools %} + <li> + <a href="#" class="js-role-edit" data-slug="{{role.slug}}"> + <i class="fa fa-edit fa-fw"></i> {{translate('EDIT')}} + </a> + </li> + {% if 'permissions' not in tools.hidden %} + <li> + <a href="#" class="js-role-permissions" data-slug="{{role.slug}}"> + <i class="fa fa-key"></i> {{translate("PERMISSION.MANAGE")}} + </a> + </li> + {% endif %} + {% if 'delete' not in tools.hidden %} + <li> + <a href="#" class="js-role-delete" data-slug="{{role.slug}}"> + <i class="fa fa-trash-o fa-fw"></i> {{translate('DELETE')}} + </a> + </li> + {% endif %} + {% endblock %} + </ul> + </div> + </div> + {% endif %} + </div> + <div class="box-body box-profile"> + <div class="text-center"> + <i class="fa fa-drivers-license fa-5x"></i> + </div> + + <h3 class="profile-username text-center">{{role.name}}</h3> + + {% if 'description' not in fields.hidden %} + <p class="text-muted"> + {{role.description}} + </p> + {% endif %} + {% if 'users' not in fields.hidden %} + <hr> + <strong><i class="fa fa-users margin-r-5"></i> {{ translate('USER', 2)}}</strong> + <p class="badge bg-blue box-profile-property"> + {{role.users.count}} + </p> + {% endif %} + </div> + </div> + </div> + <div class="col-lg-8"> + <div id="widget-role-permissions" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-key"></i> {{translate('PERMISSION', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/permissions.html.twig" with { + "table" : { + "id" : "table-role-permissions" + } + } + %} + </div> + </div> + </div> + <div class="col-lg-12"> + <div id="widget-role-users" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-key"></i> {{translate('USER', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-role-users", + "columns" : ["last_activity"] + } + } + %} + </div> + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include page variables --> + <script> + {% include "pages/partials/page.js.twig" %} + + // Add user name + page = $.extend( + true, // deep extend + { + "role_slug": "{{role.slug}}" + }, + page + ); + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/role') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/roles.html.twig b/main/app/sprinkles/admin/templates/pages/roles.html.twig new file mode 100755 index 0000000..c5b3995 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/roles.html.twig @@ -0,0 +1,50 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("ROLE", 2)}}{% endblock %} + +{% block page_description %}{{ translate("ROLE.PAGE_DESCRIPTION")}}{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-md-12"> + <div id="widget-roles" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-drivers-license"></i> {{translate('ROLE', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="panel-body"> + {% include "tables/roles.html.twig" with { + "table" : { + "id" : "table-roles" + } + } + %} + </div> + <div class="box-footer"> + <button type="button" class="btn btn-success js-role-create"> + <i class="fa fa-plus-square"></i> {{translate("ROLE.CREATE")}} + </button> + </div> + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include validation rules --> + <script> + {% include "pages/partials/page.js.twig" %} + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/roles') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/user.html.twig b/main/app/sprinkles/admin/templates/pages/user.html.twig new file mode 100755 index 0000000..d9c9ab2 --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/user.html.twig @@ -0,0 +1,195 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("USER", 2)}} | {{user.full_name}}{% endblock %} + +{% block page_description %}{{ translate("USER.INFO_PAGE", {name: user.user_name}) }}{% endblock %} + +{% block body_matter %} + {% block group_box %} + {% endblock %} + <div class="row"> + <div class="col-lg-4"> + <div id="view-user"> + {% block user_box %} + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">{{translate('USER.SUMMARY')}}</h3> + {% if 'tools' not in tools.hidden %} + <div class="box-tools pull-right"> + <div class="btn-group"> + <button type="button" class="btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="fa fa-gear"></i> <span class="caret"></span> + </button> + <ul class="dropdown-menu box-tool-menu"> + {% block tools %} + <li> + <a href="#" class="js-user-edit" data-user_name="{{user.user_name}}"> + <i class="fa fa-edit fa-fw"></i> {{translate('EDIT')}} + </a> + </li> + {% if 'password' not in tools.hidden %} + <li> + <a href="#" class="js-user-password" data-user_name="{{user.user_name}}"> + <i class="fa fa-lock fa-fw"></i> {{translate('PASSWORD')}} + </a> + </li> + {% endif %} + {% if 'roles' not in tools.hidden %} + <li> + <a href="#" class="js-user-roles" data-user_name="{{user.user_name}}"> + <i class="fa fa-drivers-license fa-fw"></i> {{translate('ROLE', 2)}} + </a> + </li> + {% endif %} + {% if 'activate' not in tools.hidden and user.flag_verified == "0" %} + <li> + <a href="#" class="js-user-activate" data-user_name="{{user.user_name}}"> + <i class="fa fa-bolt fa-fw"></i> {{translate('ACTIVATE')}} + </a> + </li> + {% endif %} + {% if 'enable' not in tools.hidden %} + {% if user.flag_enabled == "1" %} + <li> + <a href="#" class="js-user-disable" data-user_name="{{user.user_name}}"> + <i class="fa fa-minus-circle fa-fw"></i> {{translate('DISABLE')}} + </a> + </li> + {% else %} + <li> + <a href="#" class="js-user-enable" data-user_name="{{user.user_name}}"> + <i class="fa fa-plus-circle fa-fw"></i> {{translate('ENABLE')}} + </a> + </li> + {% endif %} + {% endif %} + {% if 'delete' not in tools.hidden %} + <li> + <a href="#" class="js-user-delete" data-user_name="{{user.user_name}}"> + <i class="fa fa-trash-o fa-fw"></i> {{translate('DELETE')}} + </a> + </li> + {% endif %} + {% endblock %} + </ul> + </div> + </div> + {% endif %} + </div> + <div class="box-body box-profile"> + <img class="profile-user-img img-responsive img-circle" src="{{user.avatar}}" alt="{{user.user_name}}"> + + <h3 class="profile-username text-center">{{user.full_name}}</h3> + <div class="text-center"> + {% if user.flag_enabled == 0 %} + <i class="fa fa-fw fa-minus-circle fa-lg text-red" title="{{translate('DISABLED')}}"></i> + {% endif %} + {% if user.flag_verified == 0 %} + <i class="fa fa-fw fa-bolt fa-lg text-yellow" title="{{translate('UNACTIVATED')}}"></i> + {% endif %} + </div> + <h4 class="text-muted text-center">{{user.user_name}}{% if 'group' not in fields.hidden %} • {{user.group.name}}{% endif %}</h4> + + {% if 'email' not in fields.hidden %} + <hr> + <strong><i class="fa fa-envelope margin-r-5"></i> {{translate("EMAIL")}}</strong> + <p class="text-muted box-profile-property js-copy-container"> + <i class="fa fa-copy uf-copy-trigger js-copy-trigger"></i> + <span class="js-copy-target">{{user.email}}</span> + </p> + {% endif %} + + {% if 'locale' not in fields.hidden %} + <hr> + <strong><i class="fa fa-language margin-r-5"></i> {{translate("LOCALE")}}</strong> + <p class="text-muted box-profile-property"> + {{locales[user.locale]}} + </p> + {% endif %} + + {% block user_profile %}{% endblock %} + + {% if 'roles' not in fields.hidden %} + <hr> + <strong><i class="fa fa-drivers-license margin-r-5"></i> {{translate("ROLE", 2)}}</strong> + <p class="box-profile-property"> + {% for role in user.roles %} + <span class="label label-primary" title="{{role.description}}">{{role.name}}</span> + {% endfor %} + </p> + {% endif %} + </div> + </div> + {% endblock %} + </div> + </div> + {% if 'activities' not in widgets.hidden %} + <div class="col-lg-8"> + {% block activity_box %} + <div id="widget-user-activities" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-fw fa-tasks"></i> {{translate('ACTIVITY', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/activities.html.twig" with { + "table" : { + "id" : "table-user-activities" + } + } + %} + </div> + </div> + {% endblock %} + </div> + {% endif %} + </div> + {% if 'permissions' not in widgets.hidden %} + <div class="row"> + <div class="col-md-12"> + <div id="widget-permissions" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title pull-left"><i class="fa fa-key fa-fw"></i> {{translate('PERMISSION', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/permissions.html.twig" with { + "table" : { + "id" : "table-permissions", + "columns" : ["via_roles"] + } + } + %} + </div> + </div> + </div> + </div> + {% endif %} +{% endblock %} +{% block scripts_page %} + <!-- Include page variables --> + <script> + {% include "pages/partials/page.js.twig" %} + + // Add user name + page = $.extend( + true, // deep extend + { + "user_name": "{{user.user_name}}" + }, + page + ); + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/user') | raw }} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/pages/users.html.twig b/main/app/sprinkles/admin/templates/pages/users.html.twig new file mode 100755 index 0000000..3e4642d --- /dev/null +++ b/main/app/sprinkles/admin/templates/pages/users.html.twig @@ -0,0 +1,53 @@ +{% extends "pages/abstract/dashboard.html.twig" %} + +{% block stylesheets_page %} + <!-- Page-specific CSS asset bundle --> + {{ assets.css('css/form-widgets') | raw }} +{% endblock %} + +{# Overrides blocks in head of base template #} +{% block page_title %}{{ translate("USER", 2)}}{% endblock %} + +{% block page_description %}{{ translate("USER.PAGE_DESCRIPTION")}}{% endblock %} + +{% block body_matter %} + <div class="row"> + <div class="col-md-12"> + <div id="widget-users" class="box box-primary"> + <div class="box-header"> + <h3 class="box-title pull-left"><i class="fa fa-fw fa-user"></i> {{translate('USER', 2)}}</h3> + {% include "tables/table-tool-menu.html.twig" %} + </div> + <div class="box-body"> + {% include "tables/users.html.twig" with { + "table" : { + "id" : "table-users", + "columns" : ["last_activity"] + } + } + %} + </div> + {% if checkAccess('create_user') %} + <div class="box-footer"> + <button type="button" class="btn btn-success js-user-create"> + <i class="fa fa-plus-square"></i> {{ translate("USER.CREATE")}} + </button> + </div> + {% endif %} + </div> + </div> + </div> +{% endblock %} +{% block scripts_page %} + <!-- Include validation rules --> + <script> + {% include "pages/partials/page.js.twig" %} + </script> + + <!-- Include form widgets JS --> + {{ assets.js('js/form-widgets') | raw }} + + <!-- Include page-specific JS --> + {{ assets.js('js/pages/users') | raw }} + +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/activities.html.twig b/main/app/sprinkles/admin/templates/tables/activities.html.twig new file mode 100755 index 0000000..d70541b --- /dev/null +++ b/main/app/sprinkles/admin/templates/tables/activities.html.twig @@ -0,0 +1,73 @@ +{# This partial template renders a table of user activities, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + <table id="{{table.id}}" class="tablesorter table table-bordered table-hover table-striped" data-sortlist="[[0, 1]]"> + <thead> + <tr> + <th class="sorter-metanum" data-column-name="occurred_at" data-column-template="#activity-table-column-occurred-at" data-priority="1">{{translate('ACTIVITY.TIME')}} <i class="fa fa-sort"></i></th> + {% if 'user' in table.columns %} + <th class="sorter-metatext" data-column-name="user" data-column-template="#activity-table-column-user" data-priority="1">{{translate('USER')}} <i class="fa fa-sort"></i></th> + {% endif %} + <th class="sorter-metatext" data-column-name="description" data-column-template="#activity-table-column-description" data-priority="1">{{translate("DESCRIPTION")}} <i class="fa fa-sort"></i></th> + </tr> + </thead> + <tbody> + </tbody> + </table> +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of <script> blocks, each of which is a client-side Handlebars template. + # Note that these are NOT Twig templates, although the syntax is similar. We wrap them in the `verbatim` tag, + # so that Twig will output them directly into the DOM instead of trying to treat them like Twig templates. + # + # These templates require handlebars-helpers.js, moment.js + #} + {% verbatim %} + <script id="activity-table-column-occurred-at" type="text/x-handlebars-template"> + {{#if row.occurred_at }} + <td data-num="{{dateFormat row.occurred_at format='x'}}"> + {{dateFormat row.occurred_at format="dddd"}}<br>{{dateFormat row.occurred_at format="MMM Do, YYYY h:mm a"}} + </td> + {{ else }} + <td data-num="0"> + <i>{% endverbatim %}{{translate("UNKNOWN")}}{% verbatim %}</i> + </td> + {{/if }} + </script> + + <script id="activity-table-column-user" type="text/x-handlebars-template"> + <td data-text="{{row.user.last_name}}"> + {{#if row.user }} + <strong> + <a href="{{site.uri.public}}/users/u/{{row.user.user_name}}">{{row.user.first_name}} {{row.user.last_name}} ({{row.user.user_name}})</a> + </strong> + <div class="js-copy-container"> + <span class="js-copy-target">{{row.user.email}}</span> + <button class="btn btn-xs uf-copy-trigger js-copy-trigger"><i class="fa fa-copy"></i></button> + </div> + {{ else }} + <i>{% endverbatim %}{{translate("USER.DELETED")}}{% verbatim %}</i> + {{/if }} + </td> + </script> + + <script id="activity-table-column-description" type="text/x-handlebars-template"> + <td> + <div> + {{row.ip_address}} + </div> + <div> + <i>{{row.description}}</i> + </div> + </td> + </script> + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/groups.html.twig b/main/app/sprinkles/admin/templates/tables/groups.html.twig new file mode 100755 index 0000000..2c5a84a --- /dev/null +++ b/main/app/sprinkles/admin/templates/tables/groups.html.twig @@ -0,0 +1,69 @@ +{# This partial template renders a table of groups, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + <table id="{{table.id}}" class="tablesorter table table-bordered table-hover table-striped" data-sortlist="{{table.sortlist}}"> + <thead> + <tr> + <th class="sorter-metatext" data-column-name="name" data-column-template="#group-table-column-info" data-priority="1">{{translate('GROUP')}} <i class="fa fa-sort"></i></th> + <th class="sorter-metatext" data-column-name="description" data-column-template="#group-table-column-description" data-priority="2">{{translate("DESCRIPTION")}} <i class="fa fa-sort"></i></th> + <th data-column-template="#group-table-column-actions" data-sorter="false" data-filter="false" data-priority="1">{{translate("ACTIONS")}}</th> + </tr> + </thead> + <tbody> + </tbody> + </table> +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of <script> blocks, each of which is a client-side Handlebars template. + # Note that these are NOT Twig templates, although the syntax is similar. We wrap them in the `verbatim` tag, + # so that Twig will output them directly into the DOM instead of trying to treat them like Twig templates. + # + # These templates require handlebars-helpers.js, moment.js + #} + {% verbatim %} + <script id="group-table-column-info" type="text/x-handlebars-template"> + <td data-text="{{row.name}}"> + <strong> + <i class="{{row.icon}} fa-fw"></i> <a href="{{site.uri.public}}/groups/g/{{row.slug}}">{{row.name}}</a> + </strong> + </td> + </script> + + <script id="group-table-column-description" type="text/x-handlebars-template"> + <td> + {{row.description}} + </td> + </script> + + <script id="group-table-column-actions" type="text/x-handlebars-template"> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"> + {% endverbatim %}{{translate("ACTIONS")}}{% verbatim %} + <span class="caret"></span> + </button> + <ul class="dropdown-menu dropdown-menu-right" role="menu"> + <li> + <a href="#" data-slug="{{row.slug}}" class="js-group-edit"> + <i class="fa fa-edit"></i> {% endverbatim %}{{translate("GROUP.EDIT")}}{% verbatim %} + </a> + </li> + <li> + <a href="#" data-slug="{{row.slug}}" class="js-group-delete"> + <i class="fa fa-trash-o"></i> {% endverbatim %}{{translate("GROUP.DELETE")}}{% verbatim %} + </a> + </li> + </ul> + </div> + </td> + </script> + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/permissions.html.twig b/main/app/sprinkles/admin/templates/tables/permissions.html.twig new file mode 100755 index 0000000..92e236a --- /dev/null +++ b/main/app/sprinkles/admin/templates/tables/permissions.html.twig @@ -0,0 +1,66 @@ +{# This partial template renders a table of permissions, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + <table id="{{table.id}}" class="tablesorter table table-bordered table-hover table-striped" data-sortlist="{{table.sortlist}}"> + <thead> + <tr> + <th class="sorter-metatext" data-column-name="name" data-column-template="#permission-table-column-name" data-priority="1">{{translate('PERMISSION')}} <i class="fa fa-sort"></i></th> + <th class="sorter-metatext" data-column-name="properties" data-column-template="#permission-table-column-properties" data-priority="1">{{translate('SLUG_CONDITION')}} <i class="fa fa-sort"></i></th> + {% if 'via_roles' in table.columns %} + <th data-column-template="#permission-table-column-via-roles" data-sorter="false" data-filter="false" data-priority="2">{{translate('PERMISSION.VIA_ROLES')}}</th> + {% endif %} + </tr> + </thead> + <tbody> + </tbody> + </table> +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of <script> blocks, each of which is a client-side Handlebars template. + # Note that these are NOT Twig templates, although the syntax is similar. We wrap them in the `verbatim` tag, + # so that Twig will output them directly into the DOM instead of trying to treat them like Twig templates. + # + # These templates require handlebars-helpers.js, moment.js + #} + {% verbatim %} + <script id="permission-table-column-name" type="text/x-handlebars-template"> + <td data-text="{{row.name}}"> + <div> + <strong> + <a href="{{site.uri.public}}/permissions/p/{{row.id}}">{{row.name}}</a> + </strong> + </div> + </td> + </script> + + <script id="permission-table-column-properties" type="text/x-handlebars-template"> + <td> + <div> + <code>{{row.slug}}</code> + </div> + <div> + ↳ <code>{{row.conditions}}</code> + </div> + <div> + <i>{{row.description}}</i> + </div> + </td> + </script> + + <script id="permission-table-column-via-roles" type="text/x-handlebars-template"> + <td> + {{#each row.roles_via }} + <a href="{% endverbatim %}{# Handlebars can't access variables in the global scope, so we have to use Twig to insert the base url #}{{site.uri.public}}{% verbatim %}/roles/r/{{this.slug}}" class="label label-primary" title="{{this.description}}">{{this.name}}</a> + {{/each}} + </td> + </script> + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/roles.html.twig b/main/app/sprinkles/admin/templates/tables/roles.html.twig new file mode 100755 index 0000000..dbdb49e --- /dev/null +++ b/main/app/sprinkles/admin/templates/tables/roles.html.twig @@ -0,0 +1,74 @@ +{# This partial template renders a table of roles, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + <table id="{{table.id}}" class="tablesorter table table-bordered table-hover table-striped" data-sortlist="{{table.sortlist}}"> + <thead> + <tr> + <th class="sorter-metatext" data-column-name="name" data-column-template="#role-table-column-info" data-priority="1">{{translate('ROLE')}} <i class="fa fa-sort"></i></th> + <th class="sorter-metatext" data-column-name="description" data-column-template="#role-table-column-description" data-priority="2">{{translate('DESCRIPTION')}} <i class="fa fa-sort"></i></th> + <th data-column-template="#role-table-column-actions" data-sorter="false" data-filter="false" data-priority="1">{{translate('ACTIONS')}}</th> + </tr> + </thead> + <tbody> + </tbody> + </table> +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of <script> blocks, each of which is a client-side Handlebars template. + # Note that these are NOT Twig templates, although the syntax is similar. We wrap them in the `verbatim` tag, + # so that Twig will output them directly into the DOM instead of trying to treat them like Twig templates. + # + # These templates require handlebars-helpers.js, moment.js + #} + {% verbatim %} + <script id="role-table-column-info" type="text/x-handlebars-template"> + <td data-text="{{row.name}}"> + <strong> + <a href="{{site.uri.public}}/roles/r/{{row.slug}}">{{row.name}}</a> + </strong> + </td> + </script> + + <script id="role-table-column-description" type="text/x-handlebars-template"> + <td> + {{row.description}} + </td> + </script> + + <script id="role-table-column-actions" type="text/x-handlebars-template"> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"> + {% endverbatim %}{{translate("ACTIONS")}}{% verbatim %} + <span class="caret"></span> + </button> + <ul class="dropdown-menu dropdown-menu-right" role="menu"> + <li> + <a href="#" data-slug="{{row.slug}}" class="js-role-permissions"> + <i class="fa fa-key"></i> {% endverbatim %}{{translate("PERMISSION.MANAGE")}}{% verbatim %} + </a> + </li> + <li> + <a href="#" data-slug="{{row.slug}}" class="js-role-edit"> + <i class="fa fa-edit"></i> {% endverbatim %}{{translate("ROLE.EDIT")}}{% verbatim %} + </a> + </li> + <li> + <a href="#" data-slug="{{row.slug}}" class="js-role-delete"> + <i class="fa fa-trash-o"></i> {% endverbatim %}{{translate("ROLE.DELETE")}}{% verbatim %} + </a> + </li> + </ul> + </div> + </td> + </script> + {% endverbatim %} +{% endblock %} diff --git a/main/app/sprinkles/admin/templates/tables/users.html.twig b/main/app/sprinkles/admin/templates/tables/users.html.twig new file mode 100755 index 0000000..1cebb47 --- /dev/null +++ b/main/app/sprinkles/admin/templates/tables/users.html.twig @@ -0,0 +1,149 @@ +{# This partial template renders a table of users, to be populated with rows via an AJAX request. + # This extends a generic template for paginated tables. + # + # Note that this template contains a "skeleton" table with an empty table body, and then a block of Handlebars templates which are used + # to render the table cells with the data from the AJAX request. +#} + +{% extends "tables/table-paginated.html.twig" %} + +{% block table %} + <table id="{{table.id}}" class="tablesorter table table-bordered table-hover table-striped" data-sortlist="{{table.sortlist}}"> + <thead> + <tr> + <th class="sorter-metatext" data-column-name="name" data-column-template="#user-table-column-info" data-priority="1">{{translate('USER')}} <i class="fa fa-sort"></i></th> + {% if 'last_activity' in table.columns %} + <th class="sorter-metanum" data-column-name="last_activity" data-column-template="#user-table-column-last-activity" data-priority="3">{{translate("ACTIVITY.LAST")}} <i class="fa fa-sort"></i></th> + {% endif %} + {% if 'via_roles' in table.columns %} + <th data-column-template="#user-table-column-via-roles" data-sorter="false" data-filter="false" data-priority="1">{{translate('PERMISSION.VIA_ROLES')}}</th> + {% endif %} + <th class="filter-select filter-metatext" data-column-name="status" data-column-template="#user-table-column-status" data-priority="2">{{translate("STATUS")}} <i class="fa fa-sort"></i></th> + <th data-column-name="actions" data-column-template="#user-table-column-actions" data-sorter="false" data-filter="false" data-priority="1">{{translate("ACTIONS")}}</th> + </tr> + </thead> + <tbody> + </tbody> + </table> +{% endblock %} + +{% block table_cell_templates %} + {# This contains a series of <script> blocks, each of which is a client-side Handlebars template. + # Note that these are NOT Twig templates, although the syntax is similar. We wrap them in the `verbatim` tag, + # so that Twig will output them directly into the DOM instead of trying to treat them like Twig templates. + # + # These templates require handlebars-helpers.js, moment.js + #} + {% verbatim %} + <script id="user-table-column-info" type="text/x-handlebars-template"> + <td data-text="{{row.last_name}}"> + <strong> + <a href="{{site.uri.public}}/users/u/{{row.user_name}}">{{row.first_name}} {{row.last_name}} ({{row.user_name}})</a> + </strong> + <div class="js-copy-container"> + <span class="js-copy-target">{{row.email}}</span> + <button class="btn btn-xs uf-copy-trigger js-copy-trigger"><i class="fa fa-copy"></i></button> + </div> + </td> + </script> + + <script id="user-table-column-last-activity" type="text/x-handlebars-template"> + {{#if row.last_activity }} + <td data-num="{{dateFormat row.last_activity.occurred_at format='x'}}"> + {{dateFormat row.last_activity.occurred_at format="dddd"}}<br>{{dateFormat row.last_activity.occurred_at format="MMM Do, YYYY h:mm a"}} + <br> + <i>{{row.last_activity.description}}</i> + </td> + {{ else }} + <td data-num="0"> + <i>{% endverbatim %}{{translate("UNKNOWN")}}{% verbatim %}</i> + </td> + {{/if }} + </script> + + <script id="user-table-column-status" type="text/x-handlebars-template"> + <td + {{#ifx row.flag_enabled '==' 0 }} + data-text="disabled" + {{ else }} + {{#ifx row.flag_verified '==' 0 }} + data-text="unactivated" + {{ else }} + data-text="active" + {{/ifx }} + {{/ifx }} + > + {{#ifx row.flag_enabled '==' 0 }} + <span class="text-muted"> + {% endverbatim %}{{translate("DISABLED")}}{% verbatim %} + </span> + {{ else }} + {{#ifx row.flag_verified '==' 0 }} + <span class="text-yellow"> + {% endverbatim %}{{translate("UNACTIVATED")}}{% verbatim %} + </span> + {{ else }} + <span> + {% endverbatim %}{{translate("ACTIVE")}}{% verbatim %} + </span> + {{/ifx }} + {{/ifx }} + </td> + </script> + <script id="user-table-column-actions" type="text/x-handlebars-template"> + <td class="uf-table-fit-width"> + <div class="btn-group"> + <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">{% endverbatim %}{{translate("ACTIONS")}}{% verbatim %}<span class="caret"></span></button> + <ul class="dropdown-menu dropdown-menu-right-responsive" role="menu"> + {{#ifx row.flag_verified '==' 0 }} + <li> + <a href="#" data-user_name="{{row.user_name}}" class="js-user-activate"> + <i class="fa fa-bolt"></i> {% endverbatim %}{{translate("USER.ACTIVATE")}}{% verbatim %} + </a> + </li> + {{/ifx }} + <li> + <a href="#" data-user_name="{{row.user_name}}" class="js-user-edit"> + <i class="fa fa-edit"></i> {% endverbatim %}{{translate("USER.EDIT")}}{% verbatim %} + </a> + </li> + <li> + <a href="#" data-user_name="{{row.user_name}}" class="js-user-roles"> + <i class="fa fa-drivers-license"></i> {% endverbatim %}{{translate("ROLE.MANAGE")}}{% verbatim %} + </a> + </li> + <li> + <a href="#" data-user_name="{{row.user_name}}" class="js-user-password"> + <i class="fa fa-key"></i> {% endverbatim %}{{translate("USER.ADMIN.CHANGE_PASSWORD")}}{% verbatim %} + </a> + </li> + <li> + {{#ifx row.flag_enabled '==' 1 }} + <a href="#" data-user_name="{{row.user_name}}" class="js-user-disable"> + <i class="fa fa-minus-circle"></i> {% endverbatim %}{{translate("USER.DISABLE")}}{% verbatim %} + </a> + {{ else }} + <a href="#" data-user_name="{{row.user_name}}" class="js-user-enable"> + <i class="fa fa-plus-circle"></i> {% endverbatim %}{{translate("USER.ENABLE")}}{% verbatim %} + </a> + {{/ifx }} + </li> + <li> + <a href="#" data-user_name="{{row.user_name}}" class="js-user-delete"> + <i class="fa fa-trash-o"></i> {% endverbatim %}{{translate("USER.DELETE")}}{% verbatim %} + </a> + </li> + </ul> + </div> + </td> + </script> + + <script id="user-table-column-via-roles" type="text/x-handlebars-template"> + <td> + {{#each row.roles_via }} + <a href="{% endverbatim %}{# Handlebars can't access variables in the global scope, so we have to use Twig to insert the base url #}{{site.uri.public}}{% verbatim %}/roles/r/{{this.slug}}" class="label label-primary" title="{{this.description}}">{{this.name}}</a> + {{/each}} + </td> + </script> + {% endverbatim %} +{% endblock %} |