main.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #!/usr/bin/env python3
  2. from nicegui import ui, events
  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 rename(e: events.GenericEventArguments) -> None:
  13. for row in rows:
  14. if row["id"] == e.args["id"]:
  15. row.update(e.args)
  16. ui.notify(f"Table.rows is now: {table.rows}")
  17. def delete(e: events.GenericEventArguments) -> None:
  18. rows[:] = [row for row in rows if row["id"] != e.args["id"]]
  19. ui.notify(f"Delete {e.args['id']}")
  20. table.update()
  21. def addrow() -> None:
  22. newid = max(dx["id"] for dx in rows) + 1
  23. rows.append({"id": newid, "name": "New guy", "age": 21})
  24. ui.notify(f"Added new row with id {newid}")
  25. table.update()
  26. table = ui.table(columns=columns, rows=rows, row_key="name").classes("w-72")
  27. table.add_slot(
  28. "header",
  29. r"""
  30. <q-tr :props="props">
  31. <q-th auto-width />
  32. <q-th v-for="col in props.cols" :key="col.name" :props="props">
  33. {{ col.label }}
  34. </q-th>
  35. </q-tr>
  36. """,
  37. )
  38. table.add_slot(
  39. "body",
  40. r"""
  41. <q-tr :props="props">
  42. <q-td auto-width >
  43. <q-btn size="sm" color="warning" round dense icon="delete" :props="props"
  44. @click="() => $parent.$emit('delete', props.row)" >
  45. </q-td>
  46. <q-td key="name" :props="props">
  47. {{ props.row.name }}
  48. <q-popup-edit v-model="props.row.name" v-slot="scope"
  49. @update:model-value="() => $parent.$emit('rename', props.row)" >
  50. <q-input v-model="scope.value" dense autofocus counter @keyup.enter="scope.set" />
  51. </q-popup-edit>
  52. </q-td>
  53. <q-td key="age" :props="props" class="w-8">
  54. {{ props.row.age }}
  55. <q-popup-edit v-model="props.row.age" v-slot="scope"
  56. @update:model-value="() => $parent.$emit('rename', props.row)" >
  57. <q-input v-model.number="scope.value" type="number" dense autofocus counter @keyup.enter="scope.set" />
  58. </q-popup-edit>
  59. </q-td>
  60. </q-tr>
  61. """,
  62. )
  63. table.add_slot(
  64. "bottom-row",
  65. r"""
  66. <q-tr :props="props">
  67. <q-td colspan="3" class="text-center">
  68. <q-btn color="accent" icon="add" class="w-full" @click="() => $parent.$emit('addrow')"/>
  69. </q-td>
  70. </q-tr>
  71. """,
  72. )
  73. table.on("rename", rename)
  74. table.on("delete", delete)
  75. table.on("addrow", addrow)
  76. ui.run()