1
0

main.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/env python3
  2. from nicegui import events, ui
  3. columns = [
  4. {'name': 'name', 'label': 'Name', 'field': 'name', 'align': 'left'},
  5. {'name': 'age', 'label': 'Age', 'field': 'age'},
  6. ]
  7. rows = [
  8. {'id': 0, 'name': 'Alice', 'age': 18},
  9. {'id': 1, 'name': 'Bob', 'age': 21},
  10. {'id': 2, 'name': 'Carol', 'age': 20},
  11. ]
  12. def add_row() -> None:
  13. new_id = max((dx['id'] for dx in rows), default=-1) + 1
  14. rows.append({'id': new_id, 'name': 'New guy', 'age': 21})
  15. ui.notify(f'Added new row with ID {new_id}')
  16. table.update()
  17. def rename(e: events.GenericEventArguments) -> None:
  18. for row in rows:
  19. if row['id'] == e.args['id']:
  20. row.update(e.args)
  21. ui.notify(f'Updated rows to: {table.rows}')
  22. table.update()
  23. def delete(e: events.GenericEventArguments) -> None:
  24. rows[:] = [row for row in rows if row['id'] != e.args['id']]
  25. ui.notify(f'Deleted row with ID {e.args["id"]}')
  26. table.update()
  27. table = ui.table(columns=columns, rows=rows, row_key='name').classes('w-60')
  28. table.add_slot('header', r'''
  29. <q-tr :props="props">
  30. <q-th auto-width />
  31. <q-th v-for="col in props.cols" :key="col.name" :props="props">
  32. {{ col.label }}
  33. </q-th>
  34. </q-tr>
  35. ''')
  36. table.add_slot('body', r'''
  37. <q-tr :props="props">
  38. <q-td auto-width >
  39. <q-btn size="sm" color="warning" round dense icon="delete"
  40. @click="() => $parent.$emit('delete', props.row)"
  41. />
  42. </q-td>
  43. <q-td key="name" :props="props">
  44. {{ props.row.name }}
  45. <q-popup-edit v-model="props.row.name" v-slot="scope"
  46. @update:model-value="() => $parent.$emit('rename', props.row)"
  47. >
  48. <q-input v-model="scope.value" dense autofocus counter @keyup.enter="scope.set" />
  49. </q-popup-edit>
  50. </q-td>
  51. <q-td key="age" :props="props">
  52. {{ props.row.age }}
  53. <q-popup-edit v-model="props.row.age" v-slot="scope"
  54. @update:model-value="() => $parent.$emit('rename', props.row)"
  55. >
  56. <q-input v-model.number="scope.value" type="number" dense autofocus counter @keyup.enter="scope.set" />
  57. </q-popup-edit>
  58. </q-td>
  59. </q-tr>
  60. ''')
  61. with table.add_slot('bottom-row'):
  62. with table.cell().props('colspan=3'):
  63. ui.button('Add row', icon='add', color='accent', on_click=add_row).classes('w-full')
  64. table.on('rename', rename)
  65. table.on('delete', delete)
  66. ui.run()