| {% extends 'layout.html' %} | {% from '_macros/_navigation.html' import navigation_tabs %} include ../mixins/components | {% set title = 'organizations' %} | {% block page_title %}Organizations{% endblock %} | {% block og %} meta(property="og:title", content="Dashboard") meta(name="twitter:title", content="Blender Cloud") meta(property="og:url", content="https://cloud.blender.org/{{ request.path }}") meta(property="og:type", content="website") meta(property="og:image", content="{{ url_for('static', filename='assets/img/backgrounds/cloud_services_oti.jpg')}}") meta(name="twitter:image", content="{{ url_for('static', filename='assets/img/backgrounds/cloud_services_oti.jpg')}}") | {% endblock %} | {% block navigation_tabs %} | {{ navigation_tabs(title) }} | {% endblock navigation_tabs %} | {% block body %} +nav-secondary | {% if can_create_organization %} +nav-secondary-link( class="create", onclick='createNewOrganization(this)') span.text-success i.pi-plus | Create Organization | {% endif %} li#create_organization_result_panel.result .container-fluid.dashboard-container .row .col-md-6 ul.projects__list | {% if organizations %} | {% for organization in organizations['_items'] %} | {% set link_url = url_for('pillar.web.organizations.view_embed', organization_id=organization._id) %} li.projects__list-item( data-url="{{ link_url }}", id="organization-{{ organization._id }}") a.projects__list-thumbnail( href="{{ link_url }}") i.pi-users .projects__list-details a.title(href="{{ link_url }}") | {{ organization.name }} ul.meta li(title="Members") | {{ organization.members|hide_none|count }} Member{{ organization.members|hide_none|count|pluralize }} | {% if (organization.unknown_members|count) != 0 %} | ({{ organization.unknown_members|hide_none|count }} pending) | {% endif %} li(title="Seats") | {{ organization.seat_count }} Seat{{ organization.seat_count|pluralize }} | {% endfor %} | {% else %} li.projects__list-item a.projects__list-thumbnail i.pi-blender-cloud .projects__list-details span Create an Organization to get started! | {% endif %} .col-md-6.py-1.pb-3 #item-details | {% endblock %} | {% block footer_scripts %} script(src="{{ url_for('static_pillar', filename='assets/js/vendor/jquery.typeahead-0.11.1.min.js')}}") script(src="{{ url_for('static_pillar', filename='assets/js/vendor/jquery.autocomplete-0.22.0.min.js') }}", async=true) script. /* Returns a more-or-less reasonable message given an error response object. */ function xhrErrorResponseMessage(err) { if (typeof err.responseJSON == 'undefined') return err.statusText; if (typeof err.responseJSON._error != 'undefined' && typeof err.responseJSON._error.message != 'undefined') return err.responseJSON._error.message; if (typeof err.responseJSON._message != 'undefined') return err.responseJSON._message return err.statusText; } /** * Open an organization in the #item-details div. */ function item_open(item_id, pushState) { if (item_id === undefined ) { throw new ReferenceError("item_open(" + item_id + ") called."); } // Style elements starting with item_type and dash, e.g. "#job-uuid" var clean_classes = 'active processing'; var current_item = $('#organization-' + item_id); $('[id^="organization-"]').removeClass(clean_classes); current_item .removeClass(clean_classes) .addClass('processing'); var item_url = '/o/' + item_id; $.get(item_url, function(item_data) { $('#item-details').html(item_data); current_item .removeClass(clean_classes) .addClass('active'); }).fail(function(xhr) { if (console) { console.log('Error fetching organization', item_id, 'from', item_url); console.log('XHR:', xhr); } current_item.removeClass(clean_classes); toastr.error('Failed to open organization'); if (xhr.status) { $('#item-details').html(xhr.responseText); } else { $('#item-details').html('
Opening ' + item_type + ' failed. There possibly was ' + 'an error connecting to the server. Please check your network connection and ' + 'try again.
'); } }); // Determine whether we should push the new state or not. pushState = (typeof pushState !== 'undefined') ? pushState : true; if (!pushState) return; // Push the correct URL onto the history. var push_state = {itemId: item_id}; window.history.pushState( push_state, 'Organization: ' + item_id, item_url ); } $('li.projects__list-item').click(function(e){ url = $(this).data('url'); if (typeof url === 'undefined') return; window.location.href = url; if (console) console.log(url); $(this).addClass('active'); $(this).find('.projects__list-thumbnail i') .removeAttr('class') .addClass('pi-spin spin'); }); {% if open_organization_id %} $(function() { item_open('{{ open_organization_id }}', false); }); {% endif %} {% if can_create_organization %} function createNewOrganization(button) { $(button) .attr('disabled', 'disabled') .fadeTo(200, 0.1); $('#create_organization_result_panel').html(''); // TODO: create a form to get the initial info from the user. $.post( '{{ url_for('pillar.web.organizations.create_new') }}', { name: 'New Organization', seat_count: 1, } ) .done(function(result) { var $p = $('').text('organization created, reloading list.') $('#create_organization_result_panel').html($p); window.location.href = result.location; }) .fail(function(err) { var msg = xhrErrorResponseMessage(err); $('#create_organization_result_panel').html('Error creating organization: ' + msg); $(button) .fadeTo(1000, 1.0) .queue(function() { $(this) .removeAttr('disabled') .dequeue() ; }) }) ; return false; } {% endif %} | {% endblock %}