- Introduction of eveai-listview (to select objects) that is sortable, filterable, ...

- npm build does now also include building css files.
- Source javascript and css are now defined in the source directories (eveai_app or eveai_chat_client), and automatically built for use with nginx
- eveai.css is now split into several more manageable files (per control type)
This commit is contained in:
Josako
2025-07-11 15:25:28 +02:00
parent 42635a583c
commit acad28b623
92 changed files with 6339 additions and 5168 deletions

View File

@@ -288,20 +288,45 @@ def edit_specialist(specialist_id):
@interaction_bp.route('/specialists', methods=['GET', 'POST'])
@roles_accepted('Super User', 'Partner Admin', 'Tenant Admin')
def specialists():
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
# Get all specialists (no pagination needed for client-side)
specialists_query = Specialist.query.order_by(Specialist.id)
all_specialists = specialists_query.all()
query = Specialist.query.order_by(Specialist.id)
# Prepare data for Tabulator
specialists_data = []
for specialist in all_specialists:
specialists_data.append({
'id': specialist.id,
'name': specialist.name,
'type': specialist.type,
'type_version': specialist.type_version,
'active': specialist.active
})
pagination = query.paginate(page=page, per_page=per_page)
the_specialists = pagination.items
# Column definitions
columns = [
{'title': 'ID', 'field': 'id', 'width': 80},
{'title': 'Name', 'field': 'name'},
{'title': 'Type', 'field': 'type'},
{'title': 'Type Version', 'field': 'type_version'},
{'title': 'Active', 'field': 'active', 'formatter': 'tickCross'}
]
# prepare table data
rows = prepare_table_for_macro(the_specialists,
[('id', ''), ('name', ''), ('type', ''), ('type_version', ''), ('active', ''),])
# Action definitions
actions = [
{'value': 'edit_specialist', 'text': 'Edit Specialist', 'class': 'btn-primary', 'requiresSelection': True},
{'value': 'execute_specialist', 'text': 'Execute Specialist', 'class': 'btn-primary', 'requiresSelection': True},
{'value': 'create_specialist', 'text': 'Register Specialist', 'class': 'btn-success', 'position': 'right', 'requiresSelection': False}
]
# Render the catalogs in a template
return render_template('interaction/specialists.html', rows=rows, pagination=pagination)
# Initial sort configuration
initial_sort = [{'column': 'id', 'dir': 'asc'}]
return render_template('interaction/specialists.html',
specialists_data=specialists_data,
columns=columns,
actions=actions,
initial_sort=initial_sort)
@interaction_bp.route('/handle_specialist_selection', methods=['POST'])
@@ -877,4 +902,4 @@ def edit_asset(asset_id):
db.session.rollback()
current_app.logger.error(f"Error saving asset {asset_id}: {str(e)}")
flash(f'Fout bij het opslaan van het asset: {str(e)}', 'error')
return redirect(prefixed_url_for('interaction_bp.edit_asset', asset_id=asset_id))
return redirect(prefixed_url_for('interaction_bp.edit_asset', asset_id=asset_id))